仅供学习交流,请勿用于商业用途,并遵守新浪微博相关规定。代码目录本微博机器人的实现功能如下:模拟登陆新浪微博,获取cookies;自动上传图片到微博图床;自动发送不同内容的图片和文字微博;通过定时任务实现周期性的微博任务。效果图的图文内容我已经固定好了,大家可以使用第三方API获取要发送的内容或者爬取第三方内容发送。(偷懒。。。实现发微博图文,三步登录微博即可。上传图片到微博图床获取PID。发送微博。可以使用Puppeteer节点库进行登录和登录,很容易实现登录获取微博cookie,这里就不多做介绍了,大家可以搜索Puppeteer自行学习,Puppeteer是Google官方出品的一个通过DevTools协议控制headlessChrome的Node库.你可以通过Puppeteer提供的API直接控制Chrome来模拟大部分用户操作,进行UI测试或者作为爬虫访问页面来收集数据。asyncfunctionlogin(username,password){constbrowser=awaitpuppeteer.launch({//headless:false,slowMo:250,executablePath:''});constpage=(awaitbrowser.pages())[0];awaitpage.setViewport({width:1280,height:800});awaitpage.goto("https://weibo.com/");等待页面.waitForNavigation();awaitpage.type("#loginname",用户名);awaitpage.type("#pl_login_form>div>div:nth-child(3)>div.info_list.password>div>input",password);awaitpage.click("#pl_login_form>div>div:nth-child(3)>div:nth-child(6)");awaitpage.waitForNavigation().then(result=>{returnnewPromise((resolve)=>{page.cookies().then(asynccookie=>{fs.createWriteStream("cookie.txt").write(JSON.stringify(cookie),"UTF8");//存储cookieawaitbrowser.close();//关闭打开的浏览器resolve(cookie);});})}).catch(e=>{page.screenshot({path:'code.png',type:'png',x:800,y:200,width:100,height:100});returnnewPromise((resolve,reject)=>{readSyncByRl("请输入验证码").then(async(code)=>{awaitpage.type("#pl_login_form>div>div:nth-child(3)>div.info_list.verify.clearfix>div>input",code);awaitpage.click("#pl_login_form>div>div:nth-child(3)>div:nth-child(6)");等待页面。waitForNavigation();page.cookies().then(asynccookie=>{fs.createWriteStream("cookie.txt").write(JSON.stringify(cookie),"UTF8");awaitbrowser.close();resolve(cookie);});})})})}上传图片到微博图床上传到微博图床可以看这里http://weibo.com/minipublish抓包看上传的界面过程,可以看上传的是base64图片信息,所以图片在上传前会转成base64编码,本地图片的编码和外网链接图片的编码不同。这里使用的是网上链接的图片,将节点本地图片转成base64编码比较容易。一些。上传成功后,返回微博图床图的pid。记住这个pid,这是发微博用的pid。发微博有了微博cookie和图片pid后,就可以发微博了。当有多张图片时,pid之间用|隔开。asyncfunctionweibopost(text,pic_ids='',cookie){//发送微博内容(支持图片)returnnewPromise(async(resolve,reject)=>{if(cookie===''){reject('错误:未设置Cookie!');}letpost_data=querystring.stringify({'location':'v6_content_home','text':text,'appkey':'','style_type':'1','pic_id':pic_ids,'tid':'','pdetail':'','mid':'','isReEdit':'false','rank':'0','rankid':'','模块':'stissue','pub_source':'main_','pub_type':'dialog','isPri':'0','_t':'0'});letpost_options={'Accept':'*/*','Accept-Encoding':'gzip,deflate,br','Accept-Language':'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7','Connection':'keep-alive','Content-Length':Buffer.byteLength(post_data),'Content-Type':'application/x-www-form-urlencoded','Cookie':cookie,'Host':'weibo.com','Origin':'https://weibo.com','Referer':'https://weibo.com','User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_13_3)AppleWebKit/537.36(KHTML,likeGecko)Chrome/64.0.3282.167Safari/537.36','X-Requested-With':'XMLHttpRequest'};let{data}=awaitaxios.post('https://weibo.com/aj/mblog/add?ajwvr=6&__rnd='+newDate().getTime(),post_data,{withCredentials:true,headers:post_options})if(data.code==100000){console.log('\n'+text+'-----Sent!'+'---'+newDate().toLocaleString());解决(数据);}else{console.log('发布错误');reject('发布错误');}});}最后是定时任务。定时任务可以使用node-schedule节点库,这里就不多做介绍了,大家可以自行搜索学习。这里使用的是每10分钟发送一次。functionloginTo(){login(config.username,config.password).then(async()=>{letrule=null;rule=newschedule.RecurrenceRule();rule.minute=[01,11,21,31,41,51];try{letcookie=awaitgetCookie();getContent(cookie);}catch(error){console.log(error);}j=schedule.scheduleJob(rule,async()=>{//定时任务try{letcookie=awaitgetCookie();getContent(cookie);}catch(error){console.log(error);}});})}源码地址:github地址参考https://github.com/itibbers/w...
