微信機器人項目開發--python


1、外網穿透工具下載與注冊【http://ngrok.ciqiuwl.cn/

 

 

 

2、公眾號審請

 

 

 

 

 

 

 

3、代碼編寫

糗事百科接口
# _*_ coding:utf-8   _*_
import requests
from lxml import etree
from random import randint

def get_joke():
    url="http://www.qiushibaike.com/text/page/"+ str(randint(1,5))
    r = requests.get(url)
    tree = etree.HTML(r.text)
    contentlist = tree.xpath('//div[@class="content"]/span')
    jokes = []
    for content in contentlist:
        content = content.xpath('string(.)') # string() 函數將所有子文本串聯起來,# 必須傳遞單個節點,而不是節點集。
        if '查看全文' in  content:  # 忽略包含“查看原文”笑話
            continue
        jokes.append(content)
    joke = jokes[randint(1, len(jokes))].strip()
    return joke

if __name__ == "__main__":
    content = get_joke()
    print(content)



結果:

看到好友動態一個治腳氣的偏方晚上我准備調配好給老公泡腳,剛放姜片,鹽和醋,我女兒跑過來正好看見我拉着她爸爸的腳往盆里放,

盆里還有調料淌着哈喇子蹲下來就問我:麻麻,我們晚上吃爸爸腳丫子呀😂









查詢天氣接口
import requests
from lxml import etree

def get_weather(keyword):
    url = 'https://www.tianqi.com/tianqi/search?keyword=' + keyword
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
    }
    response = requests.get(url,headers=headers)
    tree = etree.HTML(response.text)
    # 檢測城市天氣是否存在
    try:
        city_name = tree.xpath('//dd[@class="name"]/h2/text()')[0]
    except:
        content = '沒有該城市天氣信息,請確認查詢格式'
        return content
    week = tree.xpath('//dd[@class="week"]/text()')[0]
    now = tree.xpath('//p[@class="now"]')[0].xpath('string(.)')
    temp = tree.xpath('//dd[@class="weather"]/span')[0].xpath('string(.)')
    shidu = tree.xpath('//dd[@class="shidu"]/b/text()')
    kongqi = tree.xpath('//dd[@class="kongqi"]/h5/text()')[0]
    pm = tree.xpath('//dd[@class="kongqi"]/h6/text()')[0]
    content = "【{0}】{1}天氣\n當前溫度:{2}\n今日天氣:{3}\n{4}\n{5}\n{6}".format(city_name, week.split('\u3000')[0], now, temp, '\n'.join(shidu),kongqi,pm)
    return content

if __name__ == "__main__":
    keyword = '北京'
    content = get_weather(keyword)
    print(content)

結果:

【北京】2020年09月01日 星期二 庚子年七月十四 天氣
當前溫度:21℃
今日天氣:多雲18 ~ 32℃
濕度:64%
風向:東北風 1級
紫外線:無
空氣質量:優
PM: 5

 

啟動flask服務

from flask import Flask

app = Flask(__name__)
@app.route('/')
def hello():
    return 'Hello World'

if __name__ == "__main__":
    app.run(host='127.0.0.1', port=8088,debug=True)

 

 

 

微信機器人代碼

# _*_ coding:utf-8 _*_ from config import TOKEN,XML_STR from flask import Flask, request, make_response import hashlib import xml.etree.ElementTree as ET from weather import get_weather from joke import get_joke app = Flask(__name__) # 實例化一個Flask app @app.route('/message', methods=['GET', 'POST']) # 路由 def chatme(): # 定義控制器函數gf if request.method == 'GET': # GET請求 data = request.args # 獲取GET請求的參數 token = TOKEN # 微信接口調用的token signature = data.get('signature', '') # 微信接口調用的簽名 timestamp = data.get('timestamp', '') # 微信接口相關時間戳參數 nonce = data.get('nonce', '') # 微信接口相關nonce參數 echostr = data.get('echostr', '') # 微信接口相關echostr參數 s = [timestamp, nonce, token] s = ''.join(s).encode("utf-8") # 連接字符串用來校驗簽名 if hashlib.sha1(s).hexdigest() == signature: # 校驗簽名 return make_response(echostr) else: # 響應簽名錯誤 return make_response("signature validation error") if request.method == 'POST': xml_str = request.stream.read() xml = ET.fromstring(xml_str) toUserName = xml.find('ToUserName').text fromUserName = xml.find('FromUserName').text createTime = xml.find('CreateTime').text msgType = xml.find('MsgType').text # 判斷是否文本消息 if msgType != 'text': reply = XML_STR % ( fromUserName, toUserName, createTime, 'text', 'Unknow Format, Please check out' ) return reply content = xml.find('Content').text msgId = xml.find('MsgId').text if u'笑話' in content: # 輸出笑話 content = get_joke() elif content[-2:] == u"天氣": # 輸出天氣 keyword = content[:-2] if len(keyword) < 2: content = u'請輸入正確的城市名稱' return XML_STR % (fromUserName, toUserName, createTime, msgType, content) content = get_weather(keyword) else: # 輸出反話 if type(content).__name__ == "unicode": content = content[::-1] content = content.encode('UTF-8') elif type(content).__name__ == "str": print(type(content).__name__) content = content content = content[::-1] # 返回xml文件 reply = XML_STR % (fromUserName, toUserName, createTime, msgType, content) return reply if __name__ == "__main__": app.run(host='0.0.0.0', port=80,debug=True)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM