phantomjs + python 打造一个微信机器人


1.前奏

  媳妇公司不能上网,但经常需要在公众号上找一些文章做一些参考,需要的时候就把文章链接分享给我,然后我在浏览器打开网页,一点点复制过来粘贴到word中,遇到图片更悲催,还得手动调整大小。是不是感觉自己的码农职称受到了挑战……,某一天看到一篇基于C#.NET的高端智能化网络爬虫(二)(攻破携程网),才发现了PhantomJS,由此解放了我复制粘贴的双手

2.介绍

PhantomJS

  PhantomJS是一个基于webkit的JavaScript API。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON、HTML5、Canvas、SVG等,同时也提供了处理文件I/O的操作,从而使你可以向操作系统读写文件等。PhantomJS的用处可谓非常广泛,诸如网络监测、网页截屏、无需浏览器的 Web 测试、页面访问自动化等。。。

python

  python当歌,人生几何。。。

itchat

  itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。当然,该api的使用远不止一个机器人,更多的功能等着你来发现,比如这些。该接口与公众号接口itchatmp共享类似的操作方式,学习一次掌握两个工具。如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。摘自官方文档

各种文档地址

  PhantomJS官方地址:http://phantomjs.org/。

  PhantomJS官方API:http://phantomjs.org/api/。

  PhantomJS官方示例:http://phantomjs.org/examples/。

  PhantomJS GitHub:https://github.com/ariya/phantomjs/。

  python廖雪峰教程

  图灵机器人

3.话不多说,代码为证


  第一步利用PhantomJs将网页生成pdf的功能把需要的文章保存好

  1. //创建webpage模块,用来请求并生成pdf
  2. var page = require('webpage').create();
  3. //创建system模块,用来获取外部传递的参数
  4. var system = require('system');
  5. //设置编码方式
  6. phantom.outputEncoding = 'gb2312';
  7. page.onError = function (msg, trace) {
  8. console.log(msg);
  9. var msgStack = ['PHANTOM ERROR: ' + msg];
  10. if (trace && trace.length) {
  11. msgStack.push('TRACE:');
  12. trace.forEach(function (t) {
  13. msgStack.push(' -> ' +
  14. (t.file || t.sourceURL) + ': ' + t.line +
  15. (t.function ? ' (in function ' + t.function + ')' : ''));
  16. });
  17. }
  18. console.error(msgStack.join('\n'));
  19. phantom.exit(1);
  20. };
  21. if (system.args.length == 1) {
  22. console.log('请输入文章地址');
  23. phantom.exit();
  24. } else {
  25. var url = system.args[1];
  26. var filename = '';
  27. if (system.args.length == 3) {
  28. filename = system.args[2];
  29. }
  30. //地址检测
  31. if (url.indexOf('http') == -1) {
  32. url = 'http://' + url;
  33. }
  34. page.viewportSize = { width: 600, height: 20 };//设置图片大小 height自动适应
  35. //===================pdf页面设置=====================
  36. page.settings.userAgent = 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36';
  37. page.zoomFactor = 1;//页面缩放比例
  38. page.settings.loadImages = true;//页面加载图片
  39. //format :A4 纸,可以设置 "5in*7.5in", "10cm*20cm", "Letter" 等
  40. //orientation :纸方向是竖着的,或者 landscape
  41. //margin :与纸四边间距,可自定义,也可详细设置 margin : { left: ‘0.8cm‘, top : ‘0.8cm‘, right : ‘0.8cm‘, bottom : ‘0.8cm‘ }
  42. //设置页面格式
  43. //page.paperSize = { format: 'A4', orientation: 'portrait', margin: '0.8cm' };
  44. //===================pdf页面设置=====================
  45. page.open(url, function (status) {//加载页面
  46. console.log('抓取结果:' + status);
  47. //利用page的evaluate获取网页的title
  48. var title = page.evaluate(function () {
  49. return document.title;
  50. });
  51. //去除特殊字符
  52. var title = title
  53. .replace('|', '').replace('\\', '').replace('/', '').replace(':', '').replace('*', '')
  54. .replace('?', '').replace('"', '').replace('<', '').replace('>', '');
  55. filename = filename.length > 0 ? filename : title;
  56. var wait = 200;
  57. //是否是微信地址
  58. if (url.indexOf("mp.weixin.qq.com") > -1) {
  59. //设置5秒是等待微信中图片完全加载出来,具体可调整
  60. wait = 5000;
  61. //加载微信图片
  62. //includeJs 侧重网络js文件,尤其在引入jQuery等第三方库
  63. //injectJs 侧重本地的js文件,与libraryPath挂购
  64. page.injectJs('replaceimage.js', function () {
  65. var titlexx = page.evaluate(function () {
  66. return document.title;
  67. });
  68. });
  69. console.log(title);
  70. console.log('等待5秒生成pdf');
  71. }
  72. //等待页面执行完js后在进行生成
  73. window.setTimeout(function () {
  74. page.render(filename + '.pdf');
  75. console.log('pdf生成成功:' + title);
  76. phantom.exit();
  77. }, wait);
  78. });
  79. }

  由于微信页面对请求refer有限制,页面中的图片是展现不出来的,replaceimage.js是将微信页面中的图片加载出来


  1. window.onload = function change() {
  2. var metas = document.getElementsByTagName('meta');
  3. metas[0].insertAdjacentHTML('beforeBegin', "<meta name='referrer' content='never'>");
  4. var body = document.getElementById("activity-detail");
  5. //图片请求设置cookie
  6. body.insertAdjacentHTML("beforeBegin", "<image style='display: none' src='http://mmbiz.qpic.cn/mmbiz_png/pmBoItic0ByggW4X5ACKS5rfIfB1VM7RIic0TA9no7a0pRFHLcBibJX8VAyxUw756hHibQccolNUjRbKviaT3QzpwJA/0?wx_fmt=png' alt='bg'/>");
  7. //替换img图片链接
  8. var imglist = body.getElementsByTagName('IMG')
  9. for (i = 0; i < imglist.length; i++) {
  10. if (imglist[i].getAttribute('src')!=null && imglist[i].getAttribute('src').length > 0 && imglist[i].getAttribute('src').indexOf("mmbiz.qpic.cn") > -1) {
  11. imglist[i].setAttribute('src', "http://read.html5.qq.com/image?src=forum&q=5&r=0&imgflag=7&imageUrl=" + imglist[i].getAttribute('src'));
  12. }
  13. if (imglist[i].getAttribute('data-src')!=null && imglist[i].getAttribute('data-src').length > 0 && imglist[i].getAttribute('data-src').indexOf("mmbiz.qpic.cn") > -1) {
  14. imglist[i].setAttribute('src', "http://read.html5.qq.com/image?src=forum&q=5&r=0&imgflag=7&imageUrl=" + imglist[i].getAttribute('data-src'));
  15. }
  16. if (imglist[i].getAttribute('data-s')!=null && imglist[i].getAttribute('data-s').length > 0) {
  17. var w=imglist[i].getAttribute('data-s').split(",")[0];
  18. var h=imglist[i].getAttribute('data-s').split(",")[1];
  19. imglist[i].setAttribute('width',h);
  20. imglist[i].setAttribute('height',w);
  21. }
  22. }
  23. //替换背景图片
  24. var sectionlist = document.querySelectorAll('section')
  25. for (j = 0; j < sectionlist.length; j++) {
  26. var newhtml = sectionlist[j].style.backgroundImage.replace("http://mmbiz.qpic.cn", "http://read.html5.qq.com/image?src=forum&q=5&r=0&imgflag=7&imageUrl=http://mmbiz.qpic.cn");
  27. sectionlist[j].style.backgroundImage = newhtml;
  28. }
  29. }

  执行命令,phantomjs xx.js "http://mp.weixin.qq.com/s/zFdPBDJcGsTbQgKGogLzyw"


第二步利用Python结合itchat接收消息,调用phantomjs生成pdf

  1. #-*-coding:utf-8-*-
  2. import itchat,time
  3. from itchat.content import *
  4. import requests,json,sys
  5. import hashlib
  6. import HTMLParser
  7. import re
  8. import os
  9. from sys import argv
  10. #接收文本消息,提取网址
  11. @itchat.msg_register([TEXT])
  12. def text_reply(msg):
  13. # 将正则表达式编译成Pattern对象
  14. pattern = re.compile(r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*,]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", re.IGNORECASE)
  15. # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
  16. match = pattern.match(msg['Text'])
  17. if match:
  18. # 使用Match获得分组信息
  19. print match.group()
  20. filename=int(time.time())
  21. urltopdf(msg['FromUserName'],match.group(),str(filename))
  22. #获取分享的文章地址
  23. @itchat.msg_register([SHARING])
  24. def sharingtopdf(msg):
  25. filename=u''+'"'+msg['Text']+'"'
  26. urltopdf(msg['FromUserName'],msg['Url'],filename)
  27. @itchat.msg_register(PICTURE,RECORDING,ATTACHMENT,VIDEO)
  28. def download_files(msg):
  29. msg['Text'](msg['FileName'])
  30. return '@%s@%s' % ({'Picture': 'img', 'Video': 'vid'}.get(msg['Type'], 'fil'), msg['FileName'])
  31. @itchat.msg_register(FRIENDS)
  32. def add_friend(msg):
  33. itchat.add_friend(**msg['Text'])
  34. itchat.send_msg('Nice to meet you!',msg['RecommentInfo']['UserName'])
  35. @itchat.msg_register(TEXT,isGroupChat=True)
  36. def text_reply(msg):
  37. if msg['isAt']:
  38. itchat.send(u'@%s\u2005I received: %s' % (msg['ActualNickName'], msg['Content']), msg['FromUserName'])
  39. def urltopdf(touser,url,filename):
  40. #切换到phantomjs目录
  41. os.chdir('D:\sourcecode\htmlsource\phantomjs')
  42. #文件名
  43. filename= filename.replace('|', '').replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"', '').replace('<', '').replace('>', '')
  44. itchat.send(u'正在生成pdf,请稍等',touser)
  45. #解码url
  46. html_parser = HTMLParser.HTMLParser()
  47. article_url = html_parser.unescape(url)
  48. #执行
  49. #python中文编码问题解决方式
  50. cmd_method="phantomjs loadpage.js %s %s" % ('"'+url+'"',filename)
  51. os.system(cmd_method.encode('gb2312'))
  52. #发送
  53. all_file_path="D:\\sourcecode\\htmlsource\\phantomjs\\%s.pdf" % (filename)
  54. #py2.7版本需要下载fields.py 并覆盖
  55. #安装目录下 requests\packages\urllib3
  56. itchat.send_file(all_file_path,touser)
  57. itchat.auto_login(enableCmdQR=True,hotReload=True)
  58. itchat.run()

phantomjs + python 打造一个微信机器人的更多相关文章

  1. 用python写一个预警机器人(支持微信和钉钉)

    背景 线上的系统在运行中,发生故障时怎么及时的通过手机通知到相关人员?当然这是个很简单的需求,现有的方法有很多,例如: 如果我们用的云产品,那么一般都会有配套对应的监控预警功能,根据需要配置一下即可, ...

  2. 如何用20行Python代码打造一个微信群聊助手?

    今天要教大家一个黑科技,20行代码实现自己定制的微信群聊助手,可以用来活跃群气氛,好多群主创建完群后,拉完一群人,之后就一片寂静,有个群聊助手,就可以帮忙活跃群里气氛,通过今天在自己的微信上有一大批好 ...

  3. 用python itchat写一个微信机器人自动回复

    首先看一下效果: 进入正题: 一.首先要去图灵机器人网站注册一个机器人账号: 链接:http://www.tuling123.com/ 你可以获取自己的图灵机器人apikey 懒得话不注册也可以,我下 ...

  4. 使用itchat实现一个微信机器人聊天回复功能

    近看到好多群里都有一个@机器人的功能,挺有趣的,想自己也玩下,就通过百度一点点实现,在这总结一下整个从无到有的过程. 首先,要知道itchat,它是Python写的,所以想要实现这个机器人的功能,需要 ...

  5. 再也不怕和老外交流了!我用python实现一个微信聊天翻译助手!

    前言 在前面的一篇文章如何用python“优雅的”调用有道翻译中咱们清楚的写过如何一层一层的解开有道翻译的面纱,并且笔者说过那只是脑洞的开始.现在笔者又回来了.当你遇到一些外国小哥哥小姐姐很心动.想结 ...

  6. Python+ITchart实现微信机器人对指定的朋友和群自动回复

    这里我主要用了3个机器人,可以切换. 1.图灵机器人  (傻的不行,一直在问别人问题,没有限制) http://www.tuling123.com 2.showApi上的图灵机器人 (感觉最聪明,可以 ...

  7. python实现一个图灵机器人

    这标题就是个噱头...其实用的别人的接口,就是这货. 下面是代码: # -*- coding: utf-8 -*- import urllib,urllib2 import sys import js ...

  8. python打造一个Mysql数字类型注入脚本(1)

    前言: 总是想写一个sql注入脚本,但是之前的那些都不行. 这次做好了准备,然后嘿嘿嘿. 准备: sql注入的基础知识 熟悉怎么判断 正文: 思路概念图: 这里我没有限制用户输入,不限制的话可能会 @ ...

  9. python打造一个分析网站SQL注入的脚本

    前言: 昨天晚上其实就已经写完代码.只不过向FB投稿了,打算延迟一晚上在写博客 所有才到今天早上写.好了,接下来进入正题. 思路: 1.从网站源码中爬取那些类适于:http://xxx.com/xx. ...

随机推荐

  1. Python-百度经纬度转高德经纬度

    import math def bdToGaoDe(lon,lat): """ 百度坐标转高德坐标 :param lon: :param lat: :return: &q ...

  2. (网络编程)socketserver模块服务端实现并发

    基于tcp的套接字(实现并发),关键就是两个循环,一个链接循环,一个通信循环 基于udp的套接字(不是正真意义上的并发,实现真并发) socketserver模块中分两大类:server类(解决链接问 ...

  3. 初识神经网络NeuralNetworks

    1.神经网络的起源 在传统的编程方法中,我们通常会告诉计算机该做什么,并且将一个大问题分解为许多小的.精确的.计算机可以轻松执行的任务.相反,在神经网络中,我们不告诉计算机如何解决问题,而是让计算机从 ...

  4. JProfiler 入门教程

    推荐文章:JProfiler 入门教程 一.安装JProfiler 从http://www.ej-technologies.com/下载5.1.2并申请试用序列号 二.主要功能简介 1.内存剖析 Me ...

  5. 基于Linux平台的自动化运维Devops-----之自动化系统部署

    一.自动化运维的背景网站业务上线,需要运维人员在短时间内完成几百台服务器部署,包括系统安装.系统初始化.软件的安装与配置.性能的监控......所谓运维自动化,即在最少的人工干预下,利用脚本与第三方工 ...

  6. HDFS上创建文件、写入内容

    1.创建文件 hdfs dfs -touchz /aaa/aa.txt 2.写入内容 echo "<Text to append>" | hdfs dfs -appen ...

  7. 解决Oracle出现以0开头的小数,开头的0消失的问题

    项目中碰到了个问题,本来报表需要显示“0.49%”,结果就是显示成“.49%” 找问题 首先在pl/sql工具里执行sql,发现原始的数据就是“.49%”,那么问题来了,原始sql的问题,跟工具无关了 ...

  8. jQuery+存储过程实现无刷新分页(九)

    涉及到得知识点: 1.分页存储过程 2.分页原理 3.jQuery DOM操作 4.jQuery Ajax存取数据   效果图:

  9. 云平台Linux主机安装流程

    ==一.安装包===================================================================================如果是1+2主机安装 ...

  10. hihocoder 编程练习赛23

    第一题:H国的身份证号码I 题意:一个N位的正整数(首位不能是0).每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K.按从小到大的顺序输出所有合法的N位号码,每个号码占一行. 思路:dfs ...