微信鬥圖表情包專題及常見問題 - CSDN

2021-01-08 CSDN技術社區

前情提要

以前接了圖靈機器人的api做過一個微信小機器人,但是這個機器人只會尬聊也就算了,竟然連鬥圖都不能!!!雖說圖靈機器人官網上有這個api,可是由於我是用python手動接入而不是直接授權,發送表情包給他依然會回復尬聊。我深信沒有鬥圖的機器人是沒有靈魂的,於是想動手自己寫一個。

參考:用python爬取鬥圖網

列印從用戶哪裡獲得的消息,會發現,接收表情包返回的是一行文本信息:【收到不支持的消息類型,暫無法顯示】

於是我們稍微改一改之前的代碼,對這行文本進行判斷,只要接收到這行消息,參考爬取代碼從鬥圖網隨機爬取一個表情包下載下來,再傳入臨時素材庫,獲取mediaid,再生成圖片消息發送給用戶就可以了。

效果:因為又要下載又要上傳顯得稍微有點卡頓,但是還可以。

[外鏈圖片轉存失敗(img-LcIYYqi5-1567160626891)(https://sika0819.top//images/pasted-48.png)]

核心代碼:

handler.py

import hashlibimport replyimport receiveimport webimport robotimport getemoticonfrom basic import Basicfrom media import Mediaimport jsonclass Handle(object): def GET(self): try: data = web.input() if len(data) == 0: return "hello, this is handle view" signature = data.signature timestamp = data.timestamp nonce = data.nonce echostr = data.echostr token = "yourtoken" list = [token, timestamp, nonce] list.sort() sha1 = hashlib.sha1() map(sha1.update, list) hashcode = sha1.hexdigest() if hashcode == signature: return echostr else: return "" except Exception: return Exception.message def POST(self): try: webData = web.data() recMsg=receive.parse_xml(webData) if isinstance(recMsg, receive.Msg): toUser = recMsg.FromUserName fromUser = recMsg.ToUserName if recMsg.MsgType=='text': content = recMsg.Content print(content); if content=="【收到不支持的消息類型,暫無法顯示】": path=getemoticon.getRandomEmoticon() print(path) myMedia = Media() accessToken = Basic().get_access_token() mediaType = "image" callbackjson = myMedia.upload(accessToken, path, mediaType) callback = json.loads(callbackjson) mediaId=callback[u'media_id'] createTime=callback[u'created_at'] replyMsg = reply.ImageMsg(toUser, fromUser,createTime,mediaType,mediaId) return replyMsg.send() else: rpyMsg= robot.get_response(content,fromUser) replyMsg=reply.TextMsg(toUser, fromUser,rpyMsg) return replyMsg.send() if recMsg.MsgType == 'image': mediaId = recMsg.MediaId replyMsg = reply.ImageMsg(toUser, fromUser, mediaId) return replyMsg.send() else: print("none handler yet") return "success" except Exception as Argument: print Exception.message return "fail"

media.py

from basic import Basicimport urllib2import poster.encodefrom poster.streaminghttp import register_openersclass Media(object): def __init__(self): register_openers() def upload(self, accessToken, filePath, mediaType): openFile = open(filePath, "rb") param = {'media': openFile} postData, postHeaders = poster.encode.multipart_encode(param) postUrl = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s" % (accessToken, mediaType) request = urllib2.Request(postUrl, postData, postHeaders) urlResp = urllib2.urlopen(request) return urlResp.read()

reply.py

import timeclass Msg(object): def __init__(self): pass def send(self): return "success"class TextMsg(Msg): def __init__(self, toUserName, fromUserName, content): self.__dict = dict() self.__dict['ToUserName'] = toUserName self.__dict['FromUserName'] = fromUserName self.__dict['CreateTime'] = int(time.time()) self.__dict['Content'] = content def send(self): XmlForm = """ <xml> <ToUserName><![CDATA[{ToUserName}]]></ToUserName> <FromUserName><![CDATA[{FromUserName}]]></FromUserName> <CreateTime>{CreateTime}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{Content}]]></Content> </xml> """ return XmlForm.format(**self.__dict)class ImageMsg(Msg): def __init__(self, toUserName, fromUserName, mediaId): self.__dict = dict() self.__dict['ToUserName'] = toUserName self.__dict['FromUserName'] = fromUserName self.__dict['CreateTime'] = int(time.time()) self.__dict['MediaId'] = mediaId def __init__(self, toUserName, fromUserName,createTime,msgType, mediaId): self.__dict = dict() self.__dict['ToUserName'] = toUserName self.__dict['FromUserName'] = fromUserName self.__dict['CreateTime'] = createTime self.__dict['MsgType'] = msgType self.__dict['MediaId'] = mediaId def send(self): XmlForm = """ <xml> <ToUserName><![CDATA[{ToUserName}]]></ToUserName> <FromUserName><![CDATA[{FromUserName}]]></FromUserName> <CreateTime>{CreateTime}</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[{MediaId}]]></MediaId> </Image> </xml> """ return XmlForm.format(**self.__dict)

隨機爬取表情包
getemoticon.py

import randomimport requestsimport refrom bs4 import BeautifulSoupimport bs4import osmy_headers = [ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",] kv = {"User-Agent": "Mozilla/5.0"} def getHTMLText(url, headers): try: random_header = random.choice(headers) r = requests.get(url, headers={"User-Agent": random_header}, timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: print("爬取失敗") def getImgList(Ilist, html): soup = BeautifulSoup(html, "html.parser") pattern_img = re.compile(r'data-original="(.+?)"') pattern_title = re.compile(r'alt="(.+?)"') imgList = re.findall(pattern_img, html) titleList = re.findall(pattern_title, html) for i in range(len(imgList)): titleList[i] = titleList[i].encode('utf-8') Ilist.append([imgList[i], titleList[i]]) return Ilist def mkdir(): if not os.path.exists('img'): os.mkdir('img')def saveImg(Ilistcontent): mkdir() img_content = requests.get(Ilistcontent[0]).content img_path="" if (Ilistcontent[0][-4:] == '.jpg'): img_path='img/%s.jpg' % (Ilistcontent[1].decode('utf-8')) elif (Ilistcontent[0][-4:] == '.gif'): img_path='img/%s.gif' % (Ilistcontent[1].decode('utf-8')) if os.path.exists(img_path): return img_path with open(img_path, 'wb') as f: f.write(img_content) f.close() return img_pathdef download(page): Ilist = [] url = "https://www.doutula.com/photo/list/?page=%d" %page html = getHTMLText(url, my_headers) Ilist = getImgList(Ilist, html) return Ilistdef getRandomEmoticon(): print("下載圖片") page= 1; print("第%d頁"%page) Ilist= download(page); i=random.randint(0,len(Ilist)-1) print("第%d張圖"%i) path=saveImg(Ilist[i]) return path

這裡我因為怕速度太慢只爬取了第一頁,然後從第一頁隨機下載一個圖片下來。邏輯應該還可以在優化,從本地直接上傳表情包會更快。最好的方式應該是定期下載表情包,把表情存成永久素材,每次直接調用。但由於我是個懶癌晚期,完全不想進行後臺管理,於是做成了隨用隨下載。

相關焦點

  • 鬥圖黨必備!微信「以表情搜表情」上線 表情包經濟近年大火
    鬥圖黨必備!,我知道了 相信不少網友微信、QQ聊天都喜歡「表情包鬥圖」,有些小夥伴也是經常遭遇「圖到用時方恨少」,一時找不到心水的表情包而屈尊
  • 微信急缺表情包怎麼辦?啟動鬥圖神器可以輕鬆解決
    經常用微信聊天的朋友們,是不是覺得聊天中如果不加幾個表情包,就感覺聊不下去了。但是自己表情庫裡面的表情包又實在拿不出手,用來用去都是那麼幾個,而且又老不更新。這時怎麼辦呢?不用擔心,現在小編介紹個鬥圖神器給你,幫你解決急缺表情包的難題,讓你和朋友的聊天繼續精彩下去,一起去看看。
  • 對抗學習專題及常見問題 - CSDN
    隱馬爾可夫:通過顯序列算隱序列generalization ability 泛化:不要過擬合神經網絡:非線性積累NP完全問題/xbinworld/article/details/79113218】Rademacher complexity :似乎與28有關 【https://blog.csdn.net/u010185894/article/details/61916875】【https://blog.csdn.net
  • 扎心了老鐵是什麼梗什麼意思 扎心了老鐵微信鬥圖表情包
    扎心了老鐵是什麼梗什麼意思 扎心了老鐵微信鬥圖表情包時間:2017-02-13 23:43   來源:川北在線整理   責任編輯:毛青青 川北在線核心提示:原標題:扎心了老鐵是什麼梗什麼意思 扎心了老鐵微信鬥圖表情包 扎心了老鐵是什麼梗,扎心了老鐵什麼意思,經常有人帶節奏刷扎心了老鐵,扎心了老鐵表情包大全。
  • 鬥圖界扛把子是什麼意思什麼梗 爸媽鬥圖表情包是在哪下的
    鬥圖界扛把子是什麼意思什麼梗 爸媽鬥圖表情包是在哪下的時間:2017-02-17 19:33   來源:川北在線整理   責任編輯:毛青青 川北在線核心提示:原標題:鬥圖界扛把子是什麼意思什麼梗 爸媽鬥圖表情包是在哪下的 微信的出現,直接讓表情包火了起來,每天都有各種各樣的表情湧現,製作的表情包的軟體也是數不勝數,如果說發表情包是年輕人的專利
  • 製作專屬於你的GIF表情包,鬥圖不能輸
    哈嘍~小夥伴們,表情包對於我們來說是最常見不過的了,現在微信聊天不發表情包鬥個圖都不好意思和別人聊天了,表情包因為能給人輕鬆愉悅的心情,拉近彼此的距離,因此受到普羅大眾的喜愛,當然小編也是其一,實不相瞞小編的表情包可是滿滿一籮筐哦。
  • 算我求你的是什麼梗啥意思 算我求你的系列微信鬥圖表情包
    算我求你的是什麼梗啥意思 算我求你的系列微信鬥圖表情包時間:2017-02-20 23:11   來源:7230遊戲   責任編輯:毛青青 川北在線核心提示:原標題:算我求你的是什麼梗啥意思 算我求你的系列微信鬥圖表情包 近日有一些喜歡在社交軟體上與朋友們鬥圖的小夥伴跑來問小編,有沒有算我求你的表情包下載,算我求你的你去死好不好表情包下載
  • 常見問題:保存微信表情
    一、保存微信表情 圖片保存到相冊後按照下面圖示操作 二、圖片太大丨修改圖片大小 1.加入微信表情後表情尺寸會小一點【可看上方問題一
  • 下載這套表情包,一起來「鬥圖」~
    為更好宣傳推介包頭,提升包頭城市知名度和影響力,由包頭市委網信辦精心策劃設計的「包頭印象—城市地標」在微信表情商店正式推出上線,這是自治區首套城市地標建築類表情包。
  • 表情包|表情包大全|搞笑表情|鬥圖表情
    表情包|表情包大全|搞笑表情|鬥圖表情 表情大全,情商修煉 聊天套路,懟人語錄
  • 微信新表情上線!快來解鎖鬥圖新姿勢!
    就在昨天微信新表情包上線啦! 還不知情的小盆友快點看過來 下面就帶你一起解鎖微信鬥圖新姿勢!! 本次微信表情共更新了6個「小黃臉」,它們是: 其中最受矚目的「小黃臉」應該就是[讓我看看]了
  • QQ「鬥圖」新玩法,「表情包小王子」速成手冊
    隨著表情包「制霸江湖」,鬥圖成了很多人的生活常態,可是往往圖到用時方恨少,找不到合適的表情包懟回去怎麼辦?也許QQ最近正在內測的「智圖」功能可以幫到你。這是個什麼功能?怎麼用呢?QQ「智圖」使用了AI技術,可以智能匹配你需要的表情包,簡單來說,它能讓你隨時隨地找到合適的表情包配圖,一秒搜圖,成為「鬥圖達人」。「智圖」功能使用起來也非常方便哦,只需要在聊天框輸入斜槓「/」加文字,就能生成GIF鬥圖表情,刪除「/」即可回到正常對話。相較之前存圖備用的方式,用QQ「智圖」更加方便快捷,海量圖庫的資源基本能滿足日常鬥圖需要。
  • 微信新表情更新教程 微信新表情常見問題
    微信新表情更新教程 微信新表情常見問題時間:2020-11-25 21:54   來源:今日頭條   責任編輯:毛青青 川北在線核心提示:原標題:微信新表情更新教程 微信新表情常見問題 微信最近又更新了很多的新表情非常的魔性吸引了很多喜歡的小夥伴,但是還有很多吃瓜群眾不知道該怎麼更新,今天就給你們帶來了微信新表情更新教程
  • 來鬥圖!泉州消防員手繪的「Q版消防員」表情包上線啦!
    來鬥圖!泉州消防員手繪的「Q版消防員」表情包上線啦! 「Q版消防員小消」微信表情包共24個,分為「火焰藍」制服、搶險救援服、滅火戰鬥服三個系列,將消防指戰員日常生活與卡通形象相結合,再配以當下接地氣的網絡用語,使得這組表情包更加貼近生活。
  • 鬥圖能拯救朋友圈嗎,微信最新版本支持用表情包評論朋友圈動態
    在微信的最新版本中上線了一個新功能,評論好友在朋友圈發布的動態時,可以使用個人自定義的表情包,因此被大家稱之為「朋友圈鬥圖」。表情包評論朋友圈動態張小龍掌控下的微信一向以克制著稱,其產品調性也並不傾向於討好年輕用戶,突然上線「朋友圈鬥圖」這樣的功能,不免讓人覺得有些奇怪。
  • 微信聊天必備!教你一鍵製作鬥圖表情包,簡單又好用
    舉報   適用系統:安卓  不知道大家有沒有跟小雷一樣,非常喜歡鬥圖
  • 普查員專用表情包上線啦!速下載!來鬥圖!
    普查員專用表情包上線啦!速下載!來鬥圖!普查員專屬微信表情包今日正式上線啦~小薇小迅一共24幅萌萌表情包不論你發到業務討論群還是給普查對象瞬間增加好感度有木有?
  • 高校期末考試考鬥圖:用表情包畫出考試時心情
    考卷上,第一大題要求用表情包畫出考試時的心情、老師的心情、旁邊同學的心情等等。頓時各種以「迷之微笑」「大聲告訴我服不服」「我就知道這不是一場簡單的考試」,甚至校訓「明德格物、立己達人」為主題的表情包都成為了考試答案。圍觀者驚呼:「還有這種操作?這樣的卷子請給我來一打!」  學生:就問你「鬥圖」會不會?
  • 微信上線拍一拍表情包大全 別拍了表情包
    微信日前上線了拍一拍功能,相信很多網友已經收到很多好友的拍一拍,現在就有網友惡搞的拍一拍表情包也應運而生。微信拍一拍表情包非常應景,「經過我允許了嗎,就拍我,洗手了嗎就拍」等等,各種拍一拍表情包妙趣橫生。以下是各類微信拍一拍、別拍了表情包大全。
  • 這波鬥圖贏了《太乙仙魔錄之靈飛紀》表情包今日上線
    今日,備受仙俠粉絲喜愛的國創仙俠3D動畫《太乙仙魔錄之靈飛紀》推出新款微信動態表情包,動畫中一眾神仙妖魔立時化身Q版小人,搭配「有對象了嗎」、「還吃呢」、「別瞎問」等常見的生活用語,各個萌趣翻天,勢要引發網友瘋狂下載。