【公眾號開發(fā)】人工智能讓我們的公眾號活起來

開發(fā)之前

在之前的分享中睦番,我們已經(jīng)完成了公眾號的基本框架的搭建,也完成了基于NLP知識的圖文檢索功能,可以說之前的內(nèi)容都是原生開發(fā)丐箩,無論是公眾號基礎(chǔ)能力建設(shè)還是圖文檢索能力,本章分享恤煞,將會在之前的基礎(chǔ)上屎勘,通過云服務(wù)商為我們提供的AI能力,將智能聊天接入其中居扒。

首先假設(shè)一個場景:用戶關(guān)注這個公眾號之后概漱,他給公眾號發(fā)送文本消息,我們首先進(jìn)行圖文檢索喜喂,如果沒找到合適的結(jié)果瓤摧,我們就默認(rèn)進(jìn)入“聊天功能”;如果用戶發(fā)送了語音玉吁,我們同樣先進(jìn)行圖文檢索照弥,如果沒有找得到相似圖文,則通過語音進(jìn)入“聊天功能”进副,這樣看來是不是整個功能變得非常有趣产喉?

功能預(yù)覽

image

開始開發(fā)

聊天功能增加

聊天功能我們可以借助云廠商提供的聊天機(jī)器人服務(wù):

image

開通和使用這個服務(wù),可以為我們創(chuàng)建一個簡單的機(jī)器人:

image

創(chuàng)建完成機(jī)器人,我們可以通過云API對其進(jìn)行代碼的編寫曾沈,云API代碼比較難寫也不怕这嚣,有API Explorer:

image

系統(tǒng)會為我們自動編寫好基本的代碼,我們只需要稍加修改塞俱,就可以復(fù)制到項目中:

在最外層進(jìn)行相關(guān)初始化:

tbpClient = tbp_client.TbpClient(credential.Credential(secret_id, secret_key), region)

初始化完成姐帚,增加聊天機(jī)器人函數(shù):

def chatBot(user, content):
    '''
    開發(fā)文檔:https://cloud.tencent.com/document/product/1060/37438
    :param user: 用戶id
    :param content: 聊天內(nèi)容
    :return: 返回機(jī)器人說的話,如果出現(xiàn)故障返回None
    '''
    try:
        req = tbp_models.TextProcessRequest()
        params = '{"BotId":"%s","BotEnv":"release","TerminalId":"%s","InputText":"%s"}' % (
            bot_id, user, content
        )
        req.from_json_string(params)
        resp = tbpClient.TextProcess(req)
        return json.loads(resp.to_json_string())['ResponseMessage']['GroupList'][0]['Content']
    except Exception as e:
        print(e)
        return None

文本轉(zhuǎn)音頻功能增加

同樣的方法障涯,這不過是使用的另一個產(chǎn)品:

image

同樣通過Explorer編寫代碼罐旗,然后初始化:

ttsClient = tts_client.TtsClient(credential.Credential(secret_id, secret_key), region)

增加相關(guān)的方法實現(xiàn)文本到函數(shù)的轉(zhuǎn)換:

def text2Voice(text):
    '''
    文檔地址:https://cloud.tencent.com/document/product/1073/37995
    :param text: 帶轉(zhuǎn)換的文本
    :return: 返回轉(zhuǎn)換后的文件地址
    '''
    try:
        req = tts_models.TextToVoiceRequest()
        params = '{"Text":"%s","SessionId":"%s","ModelType":1,"VoiceType":1002}' % (
            text, "".join(random.sample('zyxwvutsrqponmlkjihgfedcba', 7)))
        req.from_json_string(params)
        resp = ttsClient.TextToVoice(req)
        file = '/tmp/' + "".join(random.sample('zyxwvutsrqponmlkjihgfedcba', 7)) + ".wav"
        with open(file, 'wb') as f:
            f.write(base64.b64decode(json.loads(resp.to_json_string())["Audio"]))
        return file

    except Exception as e:
        print(e)
        return None

增加微信的素材相關(guān)邏輯

由于我的賬號是未認(rèn)證的訂閱號,所以可以使用的功能有限唯蝶。在這里我需要先將生成的語音素材上傳到公眾號后臺作為永久素材九秀。因為語音類素材最大量為1000個,所以我還要順便刪除多余的素材粘我。

此處我的做法很簡單鼓蜒,先上傳素材,然后獲得素材總數(shù)征字,接下來根據(jù)素材中的時間戳:

{'
    media_id': 'HQOG98Gpaa4KcvU1L0MPEW4Zvngs4kBqOyTRzNWBNME', 
    'name': 'ljpmybc.wav',
    'update_time': 1582896372, 
    'tags': []
}

就是update_time這個參數(shù)都弹,和現(xiàn)在的時間進(jìn)行判斷,超過60S則認(rèn)為這個素材已經(jīng)過期匙姜,就可以刪除畅厢,這樣保證我們的素材數(shù)量不會溢出:

增加永久素材:

def addingOtherPermanentAssets(file, fileType):
    '''
    文檔地址:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html
    返回結(jié)果:{
                "media_id":"HQOG98Gpaa4KcvU1L0MPEcyy31LSuHhRi8gD3pvebhI",
                "url":"http:\/\/mmbiz.qpic.cn\/sz_mmbiz_png\/icxY5TTGTBibSyZPfLAEZmeaicUczsoGUpqLgBlRbNxeic4R8r94j60BiaxDLEZTAK7I7qubG3Ik808P8jYLdFJTcOA\/0?wx_fmt=png",
                "item":[]
            }
    :param file:
    :return:
    '''
    typeDict = {
        "voice": "wav"
    }
    url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=%s&type=%s" % (
        getAccessToken(), fileType)
    boundary = '----WebKitFormBoundary7MA4YWxk%s' % "".join(random.sample('zyxwvutsrqponmlkjihgfedcba', 7))
    with open(file, 'rb') as f:
        fileData = f.read()
    data = {'media': (os.path.split(file)[1], fileData, typeDict[fileType])}
    headers = {
        "Content-Type": "multipart/form-data; boundary=%s" % boundary,
        "User-Agent": "okhttp/3.10.0"
    }
    reqAttr = urllib.request.Request(url=url,
                                     data=encode_multipart_formdata(data, boundary=boundary)[0],
                                     headers=headers)
    responseData = json.loads(urllib.request.urlopen(reqAttr).read().decode("utf-8"))

    try:
        for eveVoice in getMaterialsList("voice", getTheTotalOfAllMaterials()['voice_count']):
            try:
                if int(time.time()) - int(eveVoice["update_time"]) > 60:
                    deletingPermanentAssets(eveVoice['media_id'])
            except:
                pass
    except:
        pass

    return responseData['media_id'] if "media_id" in responseData else None

刪除素材:

def deletingPermanentAssets(media_id):
    '''
    文檔地址:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Deleting_Permanent_Assets.html
    :return:
    '''
    url = 'https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=%s' % (getAccessToken())
    data = {
        "media_id": media_id
    }
    postData = json.dumps(data).encode("utf-8")
    reqAttr = urllib.request.Request(url=url, data=postData)
    print(urllib.request.urlopen(reqAttr).read())

至此,基礎(chǔ)代碼已經(jīng)完成氮昧,剩下的邏輯就是在main_handler中進(jìn)行組合:

文本消息部分的組合邏輯:

media_id = searchNews(event["Content"])
result = getNewsResult(media_id, event)
if not result:
    chatBotResponse = chatBot(event["FromUserName"], event["Content"])
    result = textXML({"msg": chatBotResponse if chatBotResponse else "目前還沒有類似的文章被發(fā)布在這個公眾號上"}, event)
    return response(body=result)

語音消息部分組合邏輯:

media_id = searchNews(event["Recognition"])
result = getNewsResult(media_id, event)
if not result:
    chatBotResponse = chatBot(event["FromUserName"], event["Recognition"])
    if chatBotResponse:
        voiceFile = text2Voice(chatBotResponse)
        if voiceFile:
            uploadResult = addingOtherPermanentAssets(voiceFile, 'voice')
            if uploadResult:
                result = voiceXML({"media_id": uploadResult}, event)
if not result:
    result = textXML({"msg": "目前還沒有類似的文章被發(fā)布在這個公眾號上"}, event)
return response(body=result)

老規(guī)矩框杜,今日份的代碼同樣更新到Github上,歡迎大家三連擊:


image

image

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袖肥,一起剝皮案震驚了整個濱河市咪辱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昭伸,老刑警劉巖梧乘,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澎迎,死亡現(xiàn)場離奇詭異庐杨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夹供,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門灵份,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哮洽,你說我怎么就攤上這事填渠。” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵氛什,是天一觀的道長莺葫。 經(jīng)常有香客問我,道長枪眉,這世上最難降的妖魔是什么捺檬? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮贸铜,結(jié)果婚禮上堡纬,老公的妹妹穿的比我還像新娘。我一直安慰自己蒿秦,他們只是感情好烤镐,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棍鳖,像睡著了一般炮叶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹊杖,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天悴灵,我揣著相機(jī)與錄音,去河邊找鬼骂蓖。 笑死积瞒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的登下。 我是一名探鬼主播茫孔,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼被芳!你這毒婦竟也來了缰贝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤畔濒,失蹤者是張志新(化名)和其女友劉穎剩晴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侵状,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赞弥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趣兄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绽左。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖艇潭,靈堂內(nèi)的尸體忽然破棺而出拼窥,到底是詐尸還是另有隱情戏蔑,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布鲁纠,位于F島的核電站总棵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏改含。R本人自食惡果不足惜彻舰,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望候味。 院中可真熱鬧刃唤,春花似錦、人聲如沸白群。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帜慢。三九已至笼裳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粱玲,已是汗流浹背躬柬。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留抽减,地道東北人允青。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像卵沉,于是被迫代替她去往敵國和親颠锉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • “沒想到這么多年過去了史汗,最后還是只有你陪我說話琼掠。”嚴(yán)松看著眼前的牌位停撞,眼神黯淡瓷蛙,“要是世鐸還在的話,我應(yīng)該不會常到...
    小子黃閱讀 465評論 0 2
  • 男孩抱著目的來加女孩的QQ戈毒,想讓她幫忙追女孩的好朋友艰猬,可惜結(jié)果不如人意。也正是這個契機(jī)副硅,兩人慢慢聯(lián)系得多了姥宝,男孩對...
  • 感恩偉大智慧的格西老師翅萤!讓我走在智慧的路上恐疲!祈愿全世界每個人都能遇到善知識腊满! 感恩健康的身體,讓我從睡夢中醒來來培己!...
    椿芽兒香閱讀 155評論 0 3
  • 【禪詩偈語】 直視無前氣吐虹碳蛋,五湖三島在胸中。 相逢莫怪不相揖省咨,只見山僧不見公肃弟。 ——蘇軾 【一縷禪思】 公元10...
    南北王閱讀 735評論 3 4