精华内容
下载资源
问答
  • 主要为大家详细介绍了python微信公众号之关注公众号自动回复,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要介绍了python微信公众号开发的相关资料,分步骤为大家分享python微信公众号开发,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 本文为大家分享了python微信公众号开发的简单过程,供大家参考,具体内容如下 网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样。真的无语了。只好自己总结一下...
  • 主要为大家详细介绍了python微信公众号之关键词自动回复,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Python 微信公众号文章爬取

    千次阅读 多人点赞 2020-11-27 11:37:55
    Python 微信公众号文章爬取一.思路二.接口分析三.实现第一步:第二步:1.请求获取对应公众号接口,取到我们需要的fakeid2.请求获取微信公众号文章接口,取到我们需要的文章数据四.总结 一.思路 我们通过网页版的微信...

    一.思路

    我们通过网页版的微信公众平台的图文消息中的超链接获取到我们需要的接口图文消息
    超链接
    从接口中我们可以得到对应的微信公众号和对应的所有微信公众号文章。

    二.接口分析

    获取微信公众号的接口:
    https://mp.weixin.qq.com/cgi-bin/searchbiz?
    参数:
    action=search_biz
    begin=0
    count=5
    query=公众号名称
    token=每个账号对应的token值
    lang=zh_CN
    f=json
    ajax=1
    请求方式:
    GET
    所以这个接口中我们只需要得到token即可,而query则是你需要搜索的公众号,token则可以通过登录后的网页链接获取得到。
    微信公众号

    获取对应公众号的文章的接口:
    https://mp.weixin.qq.com/cgi-bin/appmsg?
    参数:
    action=list_ex
    begin=0
    count=5
    fakeid=MjM5NDAwMTA2MA==
    type=9
    query=
    token=557131216
    lang=zh_CN
    f=json
    ajax=1
    请求方式:
    GET
    在这个接口中我们需要获取的值有上一步的token以及fakeid,而这个fakeid则在第一个接口中可以获取得到。从而我们就可以拿到微信公众号文章的数据了。
    微信公众号

    三.实现

    第一步:

    首先我们需要通过selenium模拟登录,然后获取到cookie和对应的token

    def weChat_login(user, password):
        post = {}
        browser = webdriver.Chrome()
        browser.get('https://mp.weixin.qq.com/')
        sleep(3)
        browser.delete_all_cookies()
        sleep(2)
        # 点击切换到账号密码输入
        browser.find_element_by_xpath("//a[@class='login__type__container__select-type']").click()
        sleep(2)
        # 模拟用户点击
        input_user = browser.find_element_by_xpath("//input[@name='account']")
        input_user.send_keys(user)
        input_password = browser.find_element_by_xpath("//input[@name='password']")
        input_password.send_keys(password)
        sleep(2)
        # 点击登录
        browser.find_element_by_xpath("//a[@class='btn_login']").click()
        sleep(2)
        # 微信登录验证
        print('请扫描二维码')
        sleep(20)
        # 刷新当前网页
        browser.get('https://mp.weixin.qq.com/')
        sleep(5)
        # 获取当前网页链接
        url = browser.current_url
        # 获取当前cookie
        cookies = browser.get_cookies()
        for item in cookies:
            post[item['name']] = item['value']
        # 转换为字符串
        cookie_str = json.dumps(post)
        # 存储到本地
        with open('cookie.txt', 'w+', encoding='utf-8') as f:
            f.write(cookie_str)
        print('cookie保存到本地成功')
        # 对当前网页链接进行切片,获取到token
        paramList = url.strip().split('?')[1].split('&')
        # 定义一个字典存储数据
        paramdict = {}
        for item in paramList:
            paramdict[item.split('=')[0]] = item.split('=')[1]
        # 返回token
        return paramdict['token']
    

    定义了一个登录方法,里面的参数为登录的账号和密码,然后定义了一个字典用来存储cookie的值。通过模拟用户输入对应的账号密码并且点击登录,然后会出现一个扫码验证,用登录的微信去扫码即可。
    刷新当前网页后,获取当前cookie以及token然后返回。

    第二步:

    1.请求获取对应公众号接口,取到我们需要的fakeid

        url = 'https://mp.weixin.qq.com'
        headers = {
            'HOST': 'mp.weixin.qq.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
        }
        with open('cookie.txt', 'r', encoding='utf-8') as f:
            cookie = f.read()
        cookies = json.loads(cookie)
        resp = requests.get(url=url, headers=headers, cookies=cookies)
        search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
        params = {
            'action': 'search_biz',
            'begin': '0',
            'count': '5',
            'query': '搜索的公众号名称',
            'token': token,
            'lang': 'zh_CN',
            'f': 'json',
            'ajax': '1'
        }
        search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
    

    将我们获取到的token和cookie传进来,然后通过requests.get请求,获得返回的微信公众号的json数据

    lists = search_resp.json().get('list')[0]
    

    通过上面的代码即可获取到对应的公众号数据

    fakeid = lists.get('fakeid')
    

    通过上面的代码就可以得到对应的fakeid

    2.请求获取微信公众号文章接口,取到我们需要的文章数据

        appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
        params_data = {
            'action': 'list_ex',
            'begin': '0',
            'count': '5',
            'fakeid': fakeid,
            'type': '9',
            'query': '',
            'token': token,
            'lang': 'zh_CN',
            'f': 'json',
            'ajax': '1'
        }
        appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
    

    我们传入fakeid和token然后还是调用requests.get请求接口,获得返回的json数据。
    我们就实现了对微信公众号文章的爬取。

    四.总结

    通过对微信公众号文章的爬取,需要掌握selenium和requests的用法,以及如何获取到请求接口。但是需要注意的是当我们循环获取文章时,一定要设置延迟时间,不然账号很容易被封禁,从而得不到返回的数据。

    展开全文
  • Python微信公众号

    2017-11-27 14:39:03
    尽管很多人吐槽王者荣耀里的小学生太坑爹,但不得不承认,近年来腾讯的...微信公众号是个人或者企业的一个宣传平台,通过开发微信公众号,可以给关注公众号的用户提供更多定制化的服务,进一步可以将服务转化为效益。

    ###  类似花生壳的 内网穿透工具:https://ngrok.cc/

    尽管很多人吐槽王者荣耀里的小学生太坑爹,但不得不承认,近年来腾讯的变现能力确实强大地吓人。这之中微信和QQ作为用户的入口,起到了很大的作用。特别是微信,已然是一款装机必备的全民软件,如何借助这个庞大的平台搞点事情,分享下微信带来的用户红利,也就成为一件很值得研究的事。微信公众号是个人或者企业的一个宣传平台,通过开发微信公众号,可以给关注公众号的用户提供更多定制化的服务,进一步可以将服务转化为效益。本文旨在给正准备做微信公众号开发的朋友分享一点经验,从而尽快熟悉微信公众号开发的整体流程。在此基础上可以继续去学习一些高级的开发技巧(比如微信支付、账单系统之类的),让自己的公众号更加地精(zhi)美(qian)。

    图片发自简书

    磨刀不误砍柴工

    微信公众号大家肯定都用过。目前微信公众号主要分为订阅号和服务号,每种账号又分为未认证和已认证,它们的差别主要在于具有不同的接口权限,下图(引用自微信开发实战系列)是一些例子:

    不同类型公众号的权限

    总体来说,服务号权限 > 订阅号权限,认证账号权限 > 未认证账号权限。申请订阅号比较简单,服务号相对复杂点,另外要认证的话还要额外提交一些材料。我们可以根据不同的业务需求去申请不同类型的账号,基本上常用的权限列表已经可以满足大部分的场景。

    开发微信公众号本质上和通常的网站开发并无区别。当我们进入一个公众号页面之后,我们可以向公众号发送文字、语音、图片等消息,也可以通过点击页面下方的菜单触发相应的功能。那么开发者与微信用户究竟是怎么进行交互的呢?实际上我们在公众号里的所有操作,都会发送到微信的服务器上,微信服务器将这些动作的具体含义按照一定的格式进行封装后,发送到微信公众号所对应的服务器上(这个服务器的地址可以由开发者在微信公众号的后台进行配置),开发者通过编写代码来处理不同的用户行为,并将处理后的结果按照一定的格式返回给微信服务器,再由微信服务器发送到微信公众号里面,从而完成了一次交互过程。在这里借用方倍老师博客中的一张图片来展示下这个过程,可以帮助大家理解地更清楚:

    微信用户与开发者的交互流程

    到这里我们可以知道,所谓的微信公众号开发,其实就是编写业务代码来处理用户的动作请求。这里面会涉及到和微信服务器之间的通信,也就涉及到一些安全认证方面的知识,后文会通过一个实际的例子进行说明。现在,就让我们来看看具体的流程吧。

    巧妇难为无米之炊

    开发微信公众号需要准备以下两样食材:

    1、微信公众号

    微信公众号可以在微信·公众平台的官网上申请。前文说过,微信公众号分为几种类型,不同的类型具有不同的权限,具体的权限列表可以查看微信公众平台技术文档。值得注意的是,现在已经不再支持个人类型的公众账号申请微信认证。申请的过程无非是填写下邮箱和信息,建议使用QQ邮箱,毕竟是自家的东西。

    2、服务器

    由于我们的服务器需要与微信服务器进行交互,因此必须能够让微信服务器可以访问到。很多公司都提供了云服务器租赁,价格不一,可以自行申请,细节在此不表。如果不想花钱申请,也可以使用一些外网穿透工具,将本地的IP暴露到公网中供外部访问,具体的工具请自行百度,不过大部分软件稳定性无法保证,而且分配的域名经常改变。个人建议还是申请一台服务器比较方便,等以后公众号运营良好开始涨(ying)粉(li)了,这些都不是事~

    撸起袖子加油干

    以下是详细步骤:

    1、开启公众号开发者模式

    为了让微信服务器知道开发者服务器的存在,必须在公众号后台进行相应的配置。

    (1)登录公众平台官网,找到左边功能栏的最下方,有一个基本配置的选项

    (2)点击基本配置按钮,在右边的页面中填写服务器的相关信息。其中URL填写http://外网IP:端口号/wx,这里外网IP是服务器的外网IP地址,端口号固定填写80。Token可以自由填写,用于两个服务器之间的验证。具体见下图:

    配置微信公众号

    (3)点击提交按钮,提示配置失败。这是自然的,因为我们还需要在开发者服务器上进行配置,才能完成验证的过程。

    (4)前面在配置微信公众号时为什么提示失败呢?在此我们有必要探究下这个认证过程。当我们点击了提交后,微信服务器会向我们所填写的那个URL发起一个GET请求,并携带以下几个参数:timestamp, nonce, echostr, signature。其中timestamp是一个时间戳,nonce是一个随机数,echostr也是随机数,这几个都很普通,重点在于signature,它的生成方式是将nonce、timestamp和token(也就是我们在网页中配置的TOKNE)三个字符串按照字典序排序后,对排序后得到的字符串数组使用哈希加密算法得到。我们的服务器在收到这个GET请求后,提取对应的参数,并按照前面说的方式生成hashcode,如果这个值与参数中的signature相同,那么我们就将echostr返回给微信服务器,否则返回空值。微信服务器收到这个echostr之后,验证这个值与它发送的echostr值是否相同,如果相同,说明这个值的确是由我们的服务器返回的,从而完成验证,今后所有的信息就都可以发送到这个服务器地址上。这里面涉及到了一些安全认证的相关知识,有兴趣的朋友可以去查阅更详细的资料。总的来说,就是让通信的双方都能够确认对方的真实身份。以下是认证部分的主要代码,使用Python2.7web.py框架编写:

    验证开发者服务器

    2、编写服务器业务逻辑

    前面我们完成了微信服务器与开发者服务器的相互认证过程,接下来我们需要编写业务逻辑代码来处理微信服务器发送过来的信息。以文本消息为例,当用户在公众号页面发送了消息后,微信服务器会将这条消息封装成如下的XML格式,并将其作为请求的内容向开发者服务器发起一个POST请求:

    微信服务器封装的请求内容

    各个字段的具体含义就如字段名所示,比较直观。我们首先需要解析这个XML对象,并提取出各个字段用于后续的处理:

    解析XML对象

    解析之后,我们可以在主函数中根据消息的不同类型,来调用不同的处理函数得到相应的处理结果,然后我们要将处理结果封装成同样的XML格式返回给微信服务器,封装XML对象的代码如下所示(以文本消息为例):

    封装XML对象

    至此,我们就完成了一个简单的回复流程(虽然目前这种只能回复文本消息==)。

    更上一层楼

    以上就是一个基本的微信公众号开发流程。当然,想要让我们的公众号变得多姿多彩,需要掌握的内容还有很多。比如

    (1)access_token:前面我们所做的实际是被动回复消息,微信服务器发起POST请求,我们将处理后的内容借由微信服务器返回给用户。如果我们需要主动地和用户进行交互,比如主动地向用户发一条消息,我们就需要调用微信公众平台提供的相应接口,并且需要主动告诉微信服务器我们的身份,这是通过access_token实现的。

    access_token是微信公众号的全局唯一接口调用凭据,公众号在调用各个接口时都需要使用access_token

    如上所述,在我们调用各个接口前,需要先使用公众号的appidappSecret信息(这两个值可以从微信公众号的网页上查看)向微信服务器请求获取access_token,然后带着这个值去调用微信公众平台提供的接口,实现相应的功能。

    (2)微信网页开发:网页开发就是指编写一系列的HTML5页面,并在微信公众号中引导用户打开我们开发的页面,从而实现相关的业务逻辑,这一功能使得公众号可以像一个内嵌在微信当中的应用一样,能够实现非常复杂的交互逻辑,而且相比于通常的应用来说更加小巧。

    从这里出发

    以上就是本文的主体内容。楼主经验尚浅,斗胆提笔撰文,有不当之处欢迎各位指出。本文主要是一个入门的简介,后续的开发还有很多内容要学,以下列出一些个人认为比较不错的文档和资料,楼主也从中学到了很多,在此感谢各位作者。

    (1)微信公众平台技术文档

    (2)方培工作室-微信公众平台开发教程

    (3)Webot

    (4)微信开发者联盟

    (5)微信开发实战系列

    本文中的代码已上传到github,里面包含了微信公众号一些常用功能的实现,仅供参考:微信公众号开发示例程序

    最后,各位如果有任何的问题或者想法,欢迎在评论区交流。

    既然都看到这了,不妨随手点个赞吧><

    作者:郗南枫 链接:http://www.jianshu.com/p/131d0c4a07cf 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    展开全文
  • Python 微信公众号开发

    2019-02-17 16:44:47
    Python 微信公众号开发
                         

    演示1

    大三上的时候,对微信公众号开发浅尝辄止的玩了一下,感觉还是挺有意思的。http://blog.csdn.net/marksinoberg/article/details/54235271  后来服务器到期了,也就搁置了。由于发布web程序,使用PHP很顺手,就使用了PHP作为开发语言。但是其实微信公众号的开发和语言关联并不大,流程,原理上都是一致的。

    快要做毕设了,想着到时候应该会部署一些代码到服务器上,进行长期的系统构建。所以趁着还是学生,就买了阿里云的学生机。买了之后,就想着玩点什么,于是微信公众号的开发,就又提上了日程。但是这次,我不打算使用PHP了,感觉局限性相对于Python而言,稍微有点大。

    使用Python的话,可以灵活的部署一些爬虫类程序,和用户交互起来也会比较方便。可拓展性感觉也比较的高,于是就选它了。

    服务器配置这部分属于是比较基础的,不太明白的可以看看我之前的那个博客,还算是比较的详细。今天就只是对核心代码做下介绍好了。


    项目目录

    root@aliyun:/var/www/html/wx/py# ls *.pyapi.py  dispatcher.py  robot.pyroot@aliyun:/var/www/html/wx/py# 
    • 1
    • 2
    • 3

    api.py

    这个文件相当于是一个关卡,涉及token的验证,和服务的支持。

    # -*- coding:utf-8 -*-                             #中文编码import sysreload(sys)  # 不加这部分处理中文还是会出问题sys.setdefaultencoding('utf-8')import timefrom flask import Flask, request, make_responseimport hashlibimport jsonimport xml.etree.ElementTree as ETfrom dispatcher import *app = Flask(__name__)app.debug = True@app.route('/')  # 默认网址def index():    return 'Index Page'@app.route('/wx', methods=['GET', 'POST'])def wechat_auth():  # 处理微信请求的处理函数,get方法用于认证,post方法取得微信转发的数据    if request.method == 'GET':        token = '你自己设置好的token'        data = request.args        signature = data.get('signature', '')        timestamp = data.get('timestamp', '')        nonce = data.get('nonce', '')        echostr = data.get('echostr', '')        s = [timestamp, nonce, token]        s.sort()        s = ''.join(s)        if (hashlib.sha1(s).hexdigest() == signature):            return make_response(echostr)    else:        rec = request.stream.read()  # 接收消息        dispatcher = MsgDispatcher(rec)        data = dispatcher.dispatch()        with open("./debug.log", "a") as file:            file.write(data)            file.close()        response = make_response(data)        response.content_type = 'application/xml'        return responseif __name__ == '__main__':    app.run(host="0.0.0.0", port=80)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    dispatcher.py

    这个文件是整个服务的核心,用于识别用户发来的消息类型,然后交给不同的handler来处理,并将运行的结果反馈给前台,发送给用户。消息类型这块,在微信的开发文档上有详细的介绍,因此这里就不再过多的赘述了。

    #! /usr/bin python# coding: utf8import sysreload(sys)sys.setdefaultencoding("utf8")import timeimport jsonimport xml.etree.ElementTree as ETfrom robot import *class MsgParser(object):    """    用于解析从微信公众平台传递过来的参数,并进行解析    """    def __init__(self, data):        self.data = data    def parse(self):        self.et = ET.fromstring(self.data)        self.user = self.et.find("FromUserName").text        self.master = self.et.find("ToUserName").text        self.msgtype = self.et.find("MsgType").text        # 纯文字信息字段        self.content = self.et.find("Content").text if self.et.find("Content") is not None else ""        # 语音信息字段        self.recognition = self.et.find("Recognition").text if self.et.find("Recognition") is not None else ""        self.format = self.et.find("Format").text if self.et.find("Format") is not None else ""        self.msgid = self.et.find("MsgId").text if self.et.find("MsgId") is not None else ""        # 图片        self.picurl = self.et.find("PicUrl").text if self.et.find("PicUrl") is not None else ""        self.mediaid = self.et.find("MediaId").text if self.et.find("MediaId") is not None else ""        # 事件        self.event = self.et.find("Event").text if self.et.find("Event") is not None else ""        return selfclass MsgDispatcher(object):    """    根据消息的类型,获取不同的处理返回值    """    def __init__(self, data):        parser = MsgParser(data).parse()        self.msg = parser        self.handler = MsgHandler(parser)    def dispatch(self):        self.result = ""  # 统一的公众号出口数据        if self.msg.msgtype == "text":            self.result = self.handler.textHandle()        elif self.msg.msgtype == "voice":            self.result = self.handler.voiceHandle()        elif self.msg.msgtype == 'image':            self.result = self.handler.imageHandle()        elif self.msg.msgtype == 'video':            self.result = self.handler.videoHandle()        elif self.msg.msgtype == 'shortvideo':            self.result = self.handler.shortVideoHandle()        elif self.msg.msgtype == 'location':            self.result = self.handler.locationHandle()        elif self.msg.msgtype == 'link':            self.result = self.handler.linkHandle()        elif self.msg.msgtype == 'event':            self.result = self.handler.eventHandle()        return self.resultclass MsgHandler(object):    """    针对type不同,转交给不同的处理函数。直接处理即可    """    def __init__(self, msg):        self.msg = msg        self.time = int(time.time())    def textHandle(self, user='', master='', time='', content=''):        template = """        <xml>             <ToUserName><![CDATA[{}]]></ToUserName>             <FromUserName><![CDATA[{}]]></FromUserName>             <CreateTime>{}</CreateTime>             <MsgType><![CDATA[text]]></MsgType>             <Content><![CDATA[{}]]></Content>         </xml>        """        # 对用户发过来的数据进行解析,并执行不同的路径        try:            response = get_response_by_keyword(self.msg.content)            if response['type'] == "image":                result = self.imageHandle(self.msg.user, self.msg.master, self.time, response['content'])            elif response['type'] == "music":                data = response['content']                result = self.musicHandle(data['title'], data['description'], data['url'], data['hqurl'])            elif response['type'] == "news":                items = response['content']                result = self.newsHandle(items)            # 这里还可以添加更多的拓展内容            else:                response = get_turing_response(self.msg.content)                result = template.format(self.msg.user, self.msg.master, self.time, response)            #with open("./debug.log", 'a') as f:            #   f.write(response['content'] + '~~' + result)            #    f.close()        except Exception as e:            with open("./debug.log", 'a') as f:               f.write("text handler:"+str(e.message))               f.close()        return result    def musicHandle(self, title='', description='', url='', hqurl=''):        template = """        <xml>             <ToUserName><![CDATA[{}]]></ToUserName>             <FromUserName><![CDATA[{}]]></FromUserName>             <CreateTime>{}</CreateTime>             <MsgType><![CDATA[music]]></MsgType>             <Music>             <Title><![CDATA[{}]]></Title>             <Description><![CDATA[{}]]></Description>             <MusicUrl><![CDATA[{}]]></MusicUrl>             <HQMusicUrl><![CDATA[{}]]></HQMusicUrl>             </Music>             <FuncFlag>0</FuncFlag>        </xml>        """        response = template.format(self.msg.user, self.msg.master, self.time, title, description, url, hqurl)        return response    def voiceHandle(self):        response = get_turing_response(self.msg.recognition)        result = self.textHandle(self.msg.user, self.msg.master, self.time, response)        return result    def imageHandle(self, user='', master='', time='', mediaid=''):        template = """        <xml>             <ToUserName><![CDATA[{}]]></ToUserName>             <FromUserName><![CDATA[{}]]></FromUserName>             <CreateTime>{}</CreateTime>             <MsgType><![CDATA[image]]></MsgType>             <Image>             <MediaId><![CDATA[{}]]></MediaId>             </Image>         </xml>        """        if mediaid == '':            response = self.msg.mediaid        else:            response = mediaid        result = template.format(self.msg.user, self.msg.master, self.time, response)        return result    def videoHandle(self):        return 'video'    def shortVideoHandle(self):        return 'shortvideo'    def locationHandle(self):        return 'location'    def linkHandle(self):        return 'link'    def eventHandle(self):        return 'event'    def newsHandle(self, items):        # 图文消息这块真的好多坑,尤其是<![CDATA[]]>中间不可以有空格,可怕极了        articlestr = """        <item>            <Title><![CDATA[{}]]></Title>            <Description><![CDATA[{}]]></Description>            <PicUrl><![CDATA[{}]]></PicUrl>            <Url><![CDATA[{}]]></Url>        </item>        """        itemstr = ""        for item in items:            itemstr += str(articlestr.format(item['title'], item['description'], item['picurl'], item['url']))        template = """        <xml>            <ToUserName><![CDATA[{}]]></ToUserName>            <FromUserName><![CDATA[{}]]></FromUserName>            <CreateTime>{}</CreateTime>            <MsgType><![CDATA[news]]></MsgType>            <ArticleCount>{}</ArticleCount>            <Articles>{}</Articles>        </xml>        """        result = template.format(self.msg.user, self.msg.master, self.time, len(items), itemstr)        return result
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197

    robot.py

    这个文件属于那种画龙点睛性质的。

    #!/usr/bin python#coding: utf8import requestsimport jsondef get_turing_response(req=""):    url = "http://www.tuling123.com/openapi/api"    secretcode = "嘿嘿,这个就不说啦"    response = requests.post(url=url, json={"key": secretcode, "info": req, "userid": 12345678})    return json.loads(response.text)['text'] if response.status_code == 200 else ""def get_qingyunke_response(req=""):    url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(req)    response = requests.get(url=url)    return json.loads(response.text)['content'] if response.status_code == 200 else ""# 简单做下。后面慢慢来def get_response_by_keyword(keyword):    if '团建' in keyword:        result = {"type": "image", "content": "3s9Dh5rYdP9QruoJ_M6tIYDnxLLdsQNCMxkY0L2FMi6HhMlNPlkA1-50xaE_imL7"}    elif 'music' in keyword or '音乐' in keyword:        musicurl='http://204.11.1.34:9999/dl.stream.qqmusic.qq.com/C400001oO7TM2DE1OE.m4a?vkey=3DFC73D67AF14C36FD1128A7ABB7247D421A482EBEDA17DE43FF0F68420032B5A2D6818E364CB0BD4EAAD44E3E6DA00F5632859BEB687344&guid=5024663952&uin=1064319632&fromtag=66'        result = {"type": "music", "content": {"title": "80000", "description":"有个男歌手姓巴,他的女朋友姓万,于是这首歌叫80000", "url": musicurl, "hqurl": musicurl}}    elif '关于' in keyword:        items = [{"title": "关于我", "description":"喜欢瞎搞一些脚本", "picurl":"https://avatars1.githubusercontent.com/u/12973402?s=460&v=4", "url":"https://github.com/guoruibiao"},                 {"title": "我的博客", "description":"收集到的,瞎写的一些博客", "picurl":"http://avatar.csdn.net/0/8/F/1_marksinoberg.jpg", "url":"http://blog.csdn.net/marksinoberg"},                 {"title": "薛定谔的��", "description": "副标题有点奇怪,不知道要怎么设置比较好","picurl": "https://www.baidu.com/img/bd_logo1.png","url": "http://www.baidu.com"}                 ]        result = {"type": "news", "content": items}    else:        result = {"type": "text", "content": "可以自由进行拓展"}    return result
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    其实这看起来是一个文件,其实可以拓展为很多的方面。

    • 如果想通过公众号来监控服务器的运行情况,就可以添加一个对服务器负载的监控的脚本;

    • 如果想做一些爬虫,每天抓取一些高质量的文章,然后通过公众号进行展示。

    • 不方便使用电脑的情况下,让公众号调用一些命令也可以算是曲线救国的一种方式。

    等等吧,其实有多少想法,就可以用Python进行事先。然后通过公众号这个平台进行展示。

    易错点

    在从PHP重构为Python的过程中,我其实也是遇到了一些坑的。下面总结下,如果恰好能帮助到遇到同样问题的你,那我这篇文章也算是没有白写了。

    微信公众号的开发,其实关键就在于理解这个工作的模式。大致有这么两条路。
    1. 用户把消息发送到微信公众平台上,平台把信息拼接组装成XML发到我们自己的服务器。(通过一系列的认证,校验,让平台知道,我们的服务是合法的),然后服务器将XML进行解析,处理。
    2. 我们的服务器解析处理完成后,将数据再次拼接组装成XML,发给微信公众平台,平台帮我们把数据反馈给对应的用户。

    这样,一个交互就算是完成了。在这个过程中,有下面几个容易出错的地方。

    • token校验: token的校验是一个get方式的请求。通过代码我们也可以看到,就是对singature的校验,具体看代码就明白了。

    • XML数据的解析,对于不同的消息,记得使用不同的格式。其中很容易出错的就是格式不规范。<!CDATA[[]]> 中括号之间最好不要有空格,不然定位起错误还是很麻烦的。

    • 服务的稳定性。这里用的web框架是flask,小巧精良。但是对并发的支持性不是很好,对此可以使用uwsgi和Nginx来实现一个更稳定的服务。如果就是打算自己玩一玩,通过命令行启用(如python api.py)就不是很保险了,因为很有可能会因为用户的一个奇怪的输入导致整个服务垮掉,建议使用nohup的方式,来在一定程度上保证服务的质量。

    结果演示

    目前这个公众号支持文字,语音,图片,图文等消息类型。示例如下。

    演示1

    演示2

    总结

    在将公众号从PHP重构为Python的过程中,遇到了一些问题,然后通过不断的摸索,慢慢的也把问题解决了。其实有时候就是这样,只有不断的发现问题,才能不断的提升自己。

    这里其实并没有深入的去完善,重构后的微信公众号其实能做的还有很多,毕竟就看敢不敢想嘛。好了,就先扯这么多了,后面如果有好的思路和实现,再回来更新好了。

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 上大学的时候,对微信公众号开发浅尝辄止的玩了一下,感觉还是挺有意思的。 //www.jb51.net/article/133677.htm后来服务器到期了,也就搁置了。由于发布web程序,使用PHP很顺手,就使用了PHP作为开发语言。但是其实...
  • Python 微信公众号文章爬取 一.思路 二.接口分析 三.实现 第一步: 第二步: 1.请求获取对应公众号接口,取到我们需要的fakeid 2.请求获取微信公众号文章接口,取到我们需要的文章数据 四....

    Python 微信公众号文章爬取

     

    一.思路

    我们通过网页版的微信公众平台的图文消息中的超链接获取到我们需要的接口图文消息
    超链接
    从接口中我们可以得到对应的微信公众号和对应的所有微信公众号文章。

    二.接口分析

    获取微信公众号的接口:
    https://mp.weixin.qq.com/cgi-bin/searchbiz?
    参数:
    action=search_biz
    begin=0
    count=5
    query=公众号名称
    token=每个账号对应的token值
    lang=zh_CN
    f=json
    ajax=1
    请求方式:
    GET
    所以这个接口中我们只需要得到token即可,而query则是你需要搜索的公众号,token则可以通过登录后的网页链接获取得到。
    微信公众号

    获取对应公众号的文章的接口:
    https://mp.weixin.qq.com/cgi-bin/appmsg?
    参数:
    action=list_ex
    begin=0
    count=5
    fakeid=MjM5NDAwMTA2MA==
    type=9
    query=
    token=557131216
    lang=zh_CN
    f=json
    ajax=1
    请求方式:
    GET
    在这个接口中我们需要获取的值有上一步的token以及fakeid,而这个fakeid则在第一个接口中可以获取得到。从而我们就可以拿到微信公众号文章的数据了。
    微信公众号

    三.实现

    第一步:

    首先我们需要通过selenium模拟登录,然后获取到cookie和对应的token

    def weChat_login(user, password):
        post = {}
        browser = webdriver.Chrome()
        browser.get('https://mp.weixin.qq.com/')
        sleep(3)
        browser.delete_all_cookies()
        sleep(2)
        # 点击切换到账号密码输入
        browser.find_element_by_xpath("//a[@class='login__type__container__select-type']").click()
        sleep(2)
        # 模拟用户点击
        input_user = browser.find_element_by_xpath("//input[@name='account']")
        input_user.send_keys(user)
        input_password = browser.find_element_by_xpath("//input[@name='password']")
        input_password.send_keys(password)
        sleep(2)
        # 点击登录
        browser.find_element_by_xpath("//a[@class='btn_login']").click()
        sleep(2)
        # 微信登录验证
        print('请扫描二维码')
        sleep(20)
        # 刷新当前网页
        browser.get('https://mp.weixin.qq.com/')
        sleep(5)
        # 获取当前网页链接
        url = browser.current_url
        # 获取当前cookie
        cookies = browser.get_cookies()
        for item in cookies:
            post[item['name']] = item['value']
        # 转换为字符串
        cookie_str = json.dumps(post)
        # 存储到本地
        with open('cookie.txt', 'w+', encoding='utf-8') as f:
            f.write(cookie_str)
        print('cookie保存到本地成功')
        # 对当前网页链接进行切片,获取到token
        paramList = url.strip().split('?')[1].split('&')
        # 定义一个字典存储数据
        paramdict = {}
        for item in paramList:
            paramdict[item.split('=')[0]] = item.split('=')[1]
        # 返回token
        return paramdict['token']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    定义了一个登录方法,里面的参数为登录的账号和密码,然后定义了一个字典用来存储cookie的值。通过模拟用户输入对应的账号密码并且点击登录,然后会出现一个扫码验证,用登录的微信去扫码即可。
    刷新当前网页后,获取当前cookie以及token然后返回。

    第二步:

    1.请求获取对应公众号接口,取到我们需要的fakeid

        url = 'https://mp.weixin.qq.com'
        headers = {
            'HOST': 'mp.weixin.qq.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
        }
        with open('cookie.txt', 'r', encoding='utf-8') as f:
            cookie = f.read()
        cookies = json.loads(cookie)
        resp = requests.get(url=url, headers=headers, cookies=cookies)
        search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
        params = {
            'action': 'search_biz',
            'begin': '0',
            'count': '5',
            'query': '搜索的公众号名称',
            'token': token,
            'lang': 'zh_CN',
            'f': 'json',
            'ajax': '1'
        }
        search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    将我们获取到的token和cookie传进来,然后通过requests.get请求,获得返回的微信公众号的json数据

    lists = search_resp.json().get('list')[0]
    
    • 1

    通过上面的代码即可获取到对应的公众号数据

    fakeid = lists.get('fakeid')
    
    • 1

    通过上面的代码就可以得到对应的fakeid

    2.请求获取微信公众号文章接口,取到我们需要的文章数据

        appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
        params_data = {
            'action': 'list_ex',
            'begin': '0',
            'count': '5',
            'fakeid': fakeid,
            'type': '9',
            'query': '',
            'token': token,
            'lang': 'zh_CN',
            'f': 'json',
            'ajax': '1'
        }
        appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    我们传入fakeid和token然后还是调用requests.get请求接口,获得返回的json数据。
    我们就实现了对微信公众号文章的爬取。

    四.总结

    通过对微信公众号文章的爬取,需要掌握selenium和requests的用法,以及如何获取到请求接口。但是需要注意的是当我们循环获取文章时,一定要设置延迟时间,不然账号很容易被封禁,从而得不到返回的数据。

    如有不懂的朋友可以通过加这个微信号,了解详细内容

    展开全文
  • 从接口中我们可以得到对应的微信公众号和对应的所有微信公众号文章。 二.接口分析 获取微信公众号的接口: https://mp.weixin.qq.com/cgi-bin/searchbiz? 参数: action=search_biz begin=0 count=5 query=公众号...
  • python微信公众号开发

    2018-10-24 09:54:03
    微信公众号的开发,暂时只做了一个简单的菜单,一个天气查询,用到了最简单的爬虫
  • python微信公众号微信用户绑定第三方网站 场景 例如,某用户在第三方购物平台的账号(user_id/手机号码等)需要跟该用户的微信账号进行绑定, 实现在该购物平台的微信公众号中查询个人信息, 消费记录, 充值记录等操作.总...
  • 谷歌云 tornado+nginx+python 微信公众号接入配置(学习笔记2018.11.11)   目前已有环境介绍: 谷歌云vm实例 centos7 外币卡首次注册送300美金,可用于购买 宝塔面板,宝塔面板可用功能很多,支持一键配置源码,...
  • 首先需要在微信公众号中配置JS接口安全域名,路径:微信公众号->设置->公众号设置->功能设置,点击设置里面有详细的教程,根据教程操作将域名写到里面,如图: 获取开发者ID和密码,获取路径:微信公众号-...
  • Python微信公众号开发

    2018-01-26 09:19:58
    摘要: 大三上的时候,对微信公众号开发浅尝辄止的玩了一下,感觉还是挺有意思的。http://blog.csdn.net/marksinoberg/article/details/54235271 后来服务器到期了,也就搁置了。 大三上的时候,对微信公众号...
  • 微信公众号长链接转换为短链接 原创内容,转载请标明地址 长链接转换为短链接的应用相对还是比较广泛的,就比如需要将长链接生成二维码的时候,过长的链接是没办法直接生成二维码的,长链接转换为短链接的方式有很多种,...
  • python微信公众号SDK

    千次阅读 2019-01-14 22:59:43
        微信api文档让人看起来很头大,新手开发会对着文档死磕,但当重复的事情做的多了以后...    今天我们来介绍下适用于python微信公众号sdk—wechatpy,使用flask作web框架的也可以使用flask-wechatpy ...
  • 从接口中我们可以得到对应的微信公众号和对应的所有微信公众号文章。 二.接口分析 获取微信公众号的接口: https://mp.weixin.qq.com/cgi-bin/searchbiz? 参数: action=search_biz begin=0 count=5 query=...
  • Python微信公众号接入图灵机器人

    千次阅读 2018-09-05 11:39:47
    微信公众号配置 网上大部分都是用itchat插件。微信公众号官网上的代码复制下来格式会乱掉。对于python这样严格依赖格式的语言简直是噩梦。这里没有使用itchat,而是使用request直接post请求图灵api 微信公众平台 ...
  • 网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样。真的无语了。只好自己总结一下开发的一些简单流程。 一先去注册个微信公众号,这个就不详细说了, 二登录...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,668
精华内容 2,267
关键字:

python微信公众号

python 订阅