QQ zone js publish

73 min read
const puppeteer = require('puppeteer');
const cheerio = require('cheerio');
const credentials = require('./credentials');
function send (shuoshuo, photos) {
    return new Promise(async (resolve, reject) => {

        const timeout = function (delay) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    try {
                        resolve(1)
                    } catch (e) {
                        reject(0)
                    }
                }, delay);
            })
        }
        const browser = await puppeteer.launch({args: ['--no-sandbox'],headless: false});
        const page = await browser.newPage();
        // 设置宽高
        await page.setViewport({
            height: 736,
            width: 414
        });

        // 设置UA
        await page.setUserAgent('Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30');

        // 设置拦截器,在无头浏览器内运行时不加载图片和视频资源
        await page.setRequestInterception(true);
        page.on('request', interceptedRequest => {
            if (interceptedRequest.resourceType() === 'image' || interceptedRequest.resourceType() === 'media') {
                interceptedRequest.respond({
                    status: 200,
                    contentType: 'image/gif',
                    body: Buffer.from('R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=', 'base64')
                })
            } else {
                interceptedRequest.continue();
            }
        });

        await page.goto('https://ui.ptlogin2.qq.com/cgi-bin/login?pt_hide_ad=1&style=9&appid=549000929&pt_no_auth=1&pt_wxtest=1&daid=5&s_url=https%3A%2F%2Fh5.qzone.qq.com%2Fmqzone%2Findex');

        try {
            await page.type('#u', 'testqq', {
                delay: 100
            });
            await page.type('#p', 'testqq@2016', {
                delay: 100
            });

            await page.tap('#go');

            await timeout(5000);

            let loginStatus = await page.content();
            let $ = cheerio.load(loginStatus);
            if($('#feed_list_cot_all > .feed').length){
                console.log('登陆成功');
            }else{
                console.log('登陆失败');
                reject('登陆失败');
                return false;
            }



            await page.tap('#page-content .tweet-txt button');

            await timeout(1000);
            await page.type('.write-text.J_textareaWrapper textarea', shuoshuo);

            // 如果有图片
            if (photos.length) {
                // 上传高清图片
                await page.tap('.ui-switch');
                const input = await page.$('#addphoto');

                // 最多只能上传9张照片
                if (photos.length > 9) {
                    photos.splice(0, 9)
                }
                await input.uploadFile(...photos);
                await timeout(photos.length * 3000);
            }

            await page.click('#form-0-submit');

            let time = 0;
            let verifySS = setInterval(async () => {
                let html = await page.content();
                if(html.indexOf('说说发表成功') !== -1){
                    clearInterval(verifySS);
                    await browser.close();
                    resolve();
                }else{
                    if(time>60){
                        clearInterval(verifySS);
                        await browser.close();
                        reject('说说发送超时');
                        return false;
                    }else{
                        time++;
                    }
                }
            }, 1000)

        } catch (error) {
            console.log(error.stack)
            await browser.close();
            reject(error);
        }
    })
}

send('测试说说', [])
    .then(() => {
        console.log('发送成功');
    })
    .catch(err => {
        console.log(err);
    })