HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    itchat怎么一直登錄(無(wú)法用itchat登錄網(wǎng)頁(yè)微信)

    發(fā)布時(shí)間:2023-03-12 07:51:03     稿源: 創(chuàng)意嶺    閱讀: 106        問(wèn)大家

    大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于itchat怎么一直登錄的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。

    ChatGPT國(guó)內(nèi)免費(fèi)在線使用,能給你生成想要的原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等

    你只需要給出你的關(guān)鍵詞,它就能返回你想要的內(nèi)容,越精準(zhǔn),寫(xiě)出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端,官網(wǎng):https://ai.de1919.com

    本文目錄:

    itchat怎么一直登錄(無(wú)法用itchat登錄網(wǎng)頁(yè)微信)

    一、用python怎么設(shè)計(jì)一個(gè)微信的接口

    最近一段時(shí)間想看看能不能用萬(wàn)能的python來(lái)對(duì)微信進(jìn)行一些操作(比如自動(dòng)搶紅包之類的...hahahaha),所以就在此記錄一下啦~~

    1、安裝

    sudo pip install itchat

    2、登錄

    itchat.auto_login()

    注:itchat.auto_login()這種方法將會(huì)通過(guò)微信掃描二維碼登錄,但是這種登錄的方式確實(shí)短時(shí)間的登錄,并不會(huì)保留登錄的狀態(tài),也就是下次登錄時(shí)還是需要掃描二維碼,如果加上hotReload==True,那么就會(huì)保留登錄的狀態(tài),至少在后面的幾次登錄過(guò)程中不會(huì)再次掃描二維碼,該參數(shù)生成一個(gè)靜態(tài)文件itchat.pkl用于存儲(chǔ)登錄狀態(tài)

    itchat.auto_login(hotReload=True)

    3、退出登錄

    主要使用的是回調(diào)函數(shù)的方法,登錄完成后的方法需要賦值在 loginCallback中退出后的方法,需要賦值在 exitCallback中.若不設(shè)置 loginCallback的值, 將會(huì)自動(dòng)刪除二維碼圖片并清空命令行顯示.

    import itchat,time

    def lcb():

    print("登錄完成!")

    def ecb():

    print("退出成功!")

    itchat.auto_login(loginCallback=lcb,exitCallback=ecb) #源碼中規(guī)定需要用回調(diào)函數(shù)。

    time.sleep(10)

    itchat.logout()  #強(qiáng)制退出登錄

    4、發(fā)送消息

    send()

    itchat.send(msg="WANGPC的微信消息!",toUserName="filehelper") #返回值為T(mén)rue或Flase

    實(shí)例:

    或者:

    send_msg

    send_msg(msg='Text Message', toUserName=None),其中的的msg是要發(fā)送的文本,toUserName是發(fā)送對(duì)象, 如果留空, 將發(fā)送給自己,返回值為T(mén)rue或者False

    實(shí)例代碼

    send_file

    send_file(fileDir, toUserName=None) fileDir是文件路徑, 當(dāng)文件不存在時(shí), 將打印無(wú)此文件的提醒,返回值為T(mén)rue或者False

    實(shí)例代碼

    send_image

    send_image(fileDir, toUserName=None) 參數(shù)同上

    實(shí)例代碼

    send_video

    send_video(fileDir, toUserName=None) 參數(shù)同上

    實(shí)例代碼

    二、微信加長(zhǎng)代碼撤回消息

    自從微信出了這個(gè)消息撤回功能小編我都已經(jīng)快被折磨死了,小編本來(lái)就是個(gè)好奇心比較重的人,微信出了這個(gè)功能之后小編感覺(jué)身體一天不如一天了,每次看著女神發(fā)來(lái)的信息又撤回,可謂是心里癢癢啊。所以小編就寫(xiě)了一個(gè)微信消息撤回捕捉器,下面就讓小編教你怎么擺脫單身逆襲白富美。

    1,模塊介紹

    首先的話要實(shí)現(xiàn)消息撤回捕捉得用到python上一個(gè)十分強(qiáng)大的庫(kù):itchat。如果大家沒(méi)有使用過(guò)的話小編就來(lái)介紹一下:

    Project description

    itchat is a open souce wechat api project for personal account.

    It enables you to access your personal wechat account through command line.

    以上意思就是:itchat是一個(gè)面向個(gè)人賬戶的開(kāi)源微信api項(xiàng)目。您可以通過(guò)命令行訪問(wèn)您的個(gè)人微信帳戶。 所以說(shuō)我們今天就要用到這個(gè)庫(kù),首先我們要 :

    pip install itchat

    2,模塊功能熟悉

    小編這里考慮到有些小伙伴從來(lái)沒(méi)用過(guò)這個(gè)模塊,所以下面會(huì)對(duì)這個(gè)模塊進(jìn)行一個(gè)簡(jiǎn)單的講解。

    2.1 如何登錄微信

    既然我們要捕捉微信的撤回信息那第一步肯定是要先登錄微信,登錄微信非常簡(jiǎn)單只需要兩行代碼:

    import itchat?itchat.login()

    這樣就好了,是不是特別簡(jiǎn)單,然后運(yùn)行之后就會(huì)出現(xiàn)一個(gè)二維碼,掃描之后再手機(jī)上面授權(quán)登錄,控制臺(tái)就會(huì)顯示你是否登錄成功。

    ·Login successfully as .

    這樣就說(shuō)明你登錄成功了,但是這邊如果是新創(chuàng)建的微信和長(zhǎng)期不使用的微信的話是無(wú)法登錄網(wǎng)頁(yè)版微信的,所以這里也會(huì)導(dǎo)致登錄不上。如果登錄不上,那也是沒(méi)有辦法的

    2.2 獲取好友列表

    import itchat

    itchat.auto_login(hotReload=True)

    friends = itchat.get_friends() # 好友列表

    print(friends)

    使用get_friends()這個(gè)函數(shù)就能獲取到好友列表的所有好友信息,包括昵稱,備注名,地址,個(gè)性標(biāo)簽,性別等等。

    [{'UserName':

    '@7c2215e17edf4b193f125d6ecf944abcaf19ba72e3eb24b8442d5e32d4a8be92',

    'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial':

    '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '',

    'EncryChatRoomId': '', '**': '', 'Signature': '', 'NickName': '**',

    'RemarkPYQuanPin': '', 'HeadImgUrl': '**'

    這里我就隨便復(fù)制了一個(gè)好友的信息,關(guān)于到隱私的問(wèn)題我就把信息全部用**代替了,我們重點(diǎn)是分析一下這些信息的內(nèi)容,比如最開(kāi)始的UserName這個(gè)是用戶的唯一標(biāo)識(shí),相當(dāng)于身份證號(hào)碼一樣的,所有的好友UserName都是不一樣的,然后是NickName:這是好友的昵稱,HeadImgUrl:這是好友的頭像地址,還有一些就不一一介紹了,大家感興趣的話可以自己去了解一下

    2.3 發(fā)送信息給好友

    我們現(xiàn)在準(zhǔn)備發(fā)送一條信息給好友,具體怎么操作呢?看下面代碼:

    import itchat

    itchat.auto_login(hotReload=True)

    itchat.send("人生苦短,我學(xué)python",toUserName="@c4326bda513bf7cdd19f1fa03dbf7e7bc3bbc57e5abb71fd580b2c3c32cddd99")

    itchat.send()這個(gè)函數(shù)可以放兩個(gè)參數(shù),第一個(gè)你要發(fā)送給好友的信息,第二個(gè)指定好友也就是toUserName=上面所說(shuō)的唯一身份標(biāo)識(shí)UserName但是上面方法我覺(jué)得還是有點(diǎn)不妥,然后我就改進(jìn)了一下:

    import itchat

    itchat.auto_login(hotReload=True)friends = itchat.get_friends()nickName = '你禿我不禿'

    for i in friends:

    if '你禿我不禿' == i['NickName']:

    itchat.send('人生苦短,我學(xué)python', toUserName=i['UserName'])

    break

    這樣我就可以發(fā)信息給任意好友,通過(guò)好友的昵稱哎好友列表中進(jìn)行查找,找到的話我就獲取該好友的UserName然后發(fā)送消息,也可以通過(guò)對(duì)好友的備注名RemarkName查找,大家可以根據(jù)自己的喜好選擇

    2.4 裝飾器

    關(guān)于itchat這個(gè)模塊還有很多功能,小編在這里就不做過(guò)多講解了,我們只要了解消息撤回所需要的知識(shí)點(diǎn)就行了,然后我們進(jìn)行最后一個(gè)內(nèi)容,裝飾器 關(guān)于裝飾器小編這邊簡(jiǎn)單介紹一下,裝飾器的是勇于擴(kuò)展原來(lái)函數(shù)功能的一種函數(shù),目的是再不改變?cè)瘮?shù)名的情況下給函數(shù)增加新的功能。 例如我喜安智又一個(gè)函數(shù)foo(),你并不知道函數(shù)的實(shí)現(xiàn)原理,你肯定也不能去修改這個(gè)函數(shù)的代碼而你需要給這個(gè)函數(shù)添加一個(gè)輸出開(kāi)始運(yùn)行時(shí)間和結(jié)束運(yùn)行時(shí)間的功能,改如何實(shí)現(xiàn),這時(shí)候你就可以用裝飾器了:

    import time

    def show_time(foo):

    def inner():

    print(time.time()) foo() print(time.time()) return inner

    @show_timedef foo(): passfoo()

    上面這段代碼的意思:首先@show_time就是使用一個(gè)裝飾器show_time,這個(gè)時(shí)候就會(huì)將裝飾器的函數(shù),也就是foo()作為參數(shù)傳遞給裝飾器show_time(),我們知到函數(shù)作為返回值的話,執(zhí)行的其實(shí)是該函數(shù),所以程序會(huì)執(zhí)行內(nèi)部函數(shù)inner(),此時(shí)輸出開(kāi)始運(yùn)行時(shí)間,然后調(diào)用foo()函數(shù),最后輸出結(jié)束運(yùn)行時(shí)間,這樣就實(shí)現(xiàn)了一個(gè)功能擴(kuò)展,這也是很典型的面向切面編程思想。

    3,如何監(jiān)聽(tīng)好友撤回的信息

    其實(shí)到了這里我們就已經(jīng)完成了消息的監(jiān)聽(tīng)只需要稍加修改就好了,但是這個(gè)程序還是有一點(diǎn)問(wèn)題的,就是所有的消息我們都需要去保存,好友正常發(fā)送過(guò)來(lái)的消息我們直接就能看到保存下來(lái)不是多此一舉嗎,我們的目的是想知道好友撤回了什么內(nèi)容,這里就涉及到如何監(jiān)聽(tīng)好友是否撤回了信息這個(gè)問(wèn)題了,其實(shí)也不難,Content模塊為我們提供了NOTE類型,這個(gè)類型指的是系統(tǒng)消息,所以我們可以自定義一個(gè)函數(shù)用來(lái)監(jiān)聽(tīng)系統(tǒng)消息:

    import itchat

    from itchat.content import * # 導(dǎo)入itchat下的content模塊

    itchat.auto_login(hotReload=True)

    @itchat.msg_register(NOTE)

    def note_info(msg): # 監(jiān)聽(tīng)系統(tǒng)消息

    print(msg)

    itchat.run()

    運(yùn)行程序,我們撤回一條信息測(cè)試一下,輸出的結(jié)果如下:

    'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': '', 'EncryChatRoomId': '', 'IsOwner': 0}>, 'Type': 'Note', 'Text': '你撤回了一條消息'}

    則例截取的部分的內(nèi)容這樣會(huì)發(fā)小撤回信息的文本內(nèi)容“你撤回了一條信息”,如意要想知道好友是否撤回了消息就很簡(jiǎn)單了,判斷一下,msg['Text']=='你撤回了一條信息'就行了

    4, 實(shí)現(xiàn)微信消息撤回捕捉功能

    現(xiàn)在關(guān)于程序的每個(gè)步驟代碼到這里也就分析完了,接下來(lái)就是對(duì)所有的代碼進(jìn)行一個(gè)總結(jié)以下就是所有代碼的總結(jié):

    現(xiàn)在我們來(lái)測(cè)試一下首先我讓我兩個(gè)朋友一人給我發(fā)了一條信息:

    三、Python需求:什么值得買(mǎi)登錄、簽到、搜索功能

    最近想買(mǎi)個(gè)行車記錄儀,經(jīng)常在在什么值得買(mǎi)上搜索信息,感覺(jué)浪費(fèi)的時(shí)間比較多,就想用Python寫(xiě)個(gè)自動(dòng)搜索的功能。另外,什么值得買(mǎi)已經(jīng)很久沒(méi)有簽到了,剛開(kāi)始玩的時(shí)候臺(tái)天天簽到,樂(lè)此不?!,F(xiàn)在已經(jīng)很久沒(méi)有簽到了,既然我是碼農(nóng),當(dāng)然得實(shí)現(xiàn)自動(dòng)化哈。

    1.實(shí)現(xiàn)自動(dòng)登錄;

    2.實(shí)現(xiàn)自動(dòng)簽到;

    3.實(shí)現(xiàn)搜索功能;

    requests庫(kù)應(yīng)該就能實(shí)現(xiàn)這些功能,但是需要解析頁(yè)面,我這些需求簡(jiǎn)單,沒(méi)有性能要求,因此采用簡(jiǎn)單的selenium庫(kù)模擬瀏覽器操作實(shí)現(xiàn)這個(gè)需求。

    selenium、BeautifulSoup

    關(guān)于selenium的使用在 Python爬取煎蛋妹子圖 里有介紹。

    遇到的坑:

    1.點(diǎn)擊登錄按鈕后,彈出登錄框,后續(xù)無(wú)法找到用戶名、密碼的element。

    開(kāi)始以為是點(diǎn)擊登錄后,馬上就去獲取這個(gè)element,此時(shí)登錄框還沒(méi)有彈出來(lái),因此延遲了3秒(這個(gè)問(wèn)題在模擬登錄百度時(shí)碰到過(guò))。依舊不能解決。問(wèn)題原因就是沒(méi)有獲取到當(dāng)前登錄框的handle,因此獲取所有的window_handle,然后切換到當(dāng)前的,debug發(fā)現(xiàn)是始終只有一個(gè)handle。

    其實(shí)什么值得買(mǎi)的登錄框是一個(gè)frame,需要采用switch_to.frame方法定位到當(dāng)前frame。

    搜索只處理了搜索結(jié)果的第一頁(yè),如果需要更多的數(shù)據(jù),處理分頁(yè)即可。

    以上三個(gè)方法即實(shí)現(xiàn)了三個(gè)功能需求,但是我想要每天自動(dòng)實(shí)現(xiàn)登錄、簽到功能,同時(shí)搜索‘行車記錄儀’處理結(jié)果能夠發(fā)送到手機(jī)。實(shí)現(xiàn)搜索結(jié)果發(fā)送到手機(jī),自然想到了 itchat 這個(gè)庫(kù)。另外使用 apscheduler 實(shí)現(xiàn)了定時(shí)任務(wù)。

    下面開(kāi)始列遇到的坑:

    1.簽到時(shí)

    寫(xiě)的時(shí)候沒(méi)注意,捕獲異常寫(xiě)了EOFrror,導(dǎo)致簽到過(guò)后,后續(xù)不會(huì)發(fā)送微信消息。EOFrror是意味著它發(fā)現(xiàn)了一個(gè)不期望的文件尾時(shí)會(huì)拋出的異常,因此這里不會(huì)捕獲到。

    修改成:

    四、基于wechaty的定時(shí)消息推送(可以哄女朋友)、智能聊天和私人助理

    ---

    title: "基于wechaty的定時(shí)消息推送(可以哄女朋友)、智能聊天和私人助理"

    author: jasonlovesharon

    email: 54027901@163.com

    tags:

      - nodejs

      - wechaty

      - wechaty-puppet-padplus

    ---

    ## 前言

    - 自從2017年微信web端API限制以后,itchat等一大批bot歇菜了,一直都在找一款合適的替品

    - 目前來(lái)看,大部分都是針對(duì)windows微信客戶端,基于HOOK的dll注入實(shí)現(xiàn)對(duì)微信的操控,有一定的封號(hào)風(fēng)險(xiǎn),只能用固定的版本,部署在linux服務(wù)器端比較困難,意味著只能一直開(kāi)著電- -wechaty,支持IPAD,,MAC等多種協(xié)議,不用去調(diào)用WEB網(wǎng)頁(yè)API,并且可以布署在服務(wù)器,滿足我所有需求。[項(xiàng)目地址](https://github.com/wechaty/wechaty)

    - 看完官方文檔后([token官方介紹](https://github.com/juzibot/welcome/wiki/everything-about-wechaty)), 發(fā)現(xiàn)需要申請(qǐng)Token,并且python版本的Token是要付費(fèi)的,但沒(méi)有學(xué)過(guò)typescript,有點(diǎn)想放棄,瀏覽了一下ding-dong-bot的Example,似乎可以看懂,那就邊學(xué)習(xí)邊摸索吧。(ps:后來(lái)偶然見(jiàn)發(fā)現(xiàn)了另一篇可以使用將token轉(zhuǎn)變一下實(shí)現(xiàn)python版wechaty,但此時(shí)已經(jīng)基本用TS寫(xiě)完了,如果想用Python等其他語(yǔ)言可以參考[官方文檔](https://github.com/wechaty/wechaty/issues/1985)。)

    ## 具備功能

    ### 1. 關(guān)鍵詞觸發(fā)功能

    1.1 關(guān)鍵詞"介紹一下自己"、 "自我介紹一下"、 "你是誰(shuí)"觸發(fā)自我介紹

    1.2 地名+天氣 觸發(fā)天氣查詢

    ### 2. 智能聊天功能

    2.1群外直接聊天

    2.2群內(nèi)成員皆有聊天權(quán)限“@bot” 聊天

    2.3不會(huì)回復(fù) @其他群成員 的消息

    ## 實(shí)現(xiàn)過(guò)程

    Talk is cheap,show your code

    ### 1. 主程序

    ```typescript

    import { Wechaty, Message, UrlLink,log,} from 'wechaty'

    import { PuppetPadplus } from 'wechaty-puppet-padplus'

    import { EventLogger, QRCodeTerminal } from 'wechaty-plugin-contrib'

    import { WechatyWeixinOpenAI, } from 'wechaty-weixin-openai'

    import { setSchedule, } from './schedule/index'

    import { getDay, formatDate,} from './utils/index'

    import { getOne, getTXweather, getSweetWord,} from './superagent/index'

    // 創(chuàng)建微信每日說(shuō)定時(shí)任務(wù)

    async function initDay() {

      console.log(`已經(jīng)設(shè)定每日說(shuō)任務(wù)`);

      setSchedule('0 40 0 * * *', async () => {

        console.log('你的貼心小助理開(kāi)始工作啦!')

        let logMsg

        let contact =

          (await bot.Contact.find({ name: 'Jason' })) ||

          (await bot.Contact.find({ alias: 'boss' })) // 獲取你要發(fā)送的聯(lián)系人

        let one = await getOne() //獲取每日一句

        let weather = await getTXweather() //獲取天氣信息

        let today = await formatDate(new Date()) //獲取今天的日期

        let memorialDay = getDay('2009/08/07') //獲取紀(jì)念日天數(shù)

        let sweetWord = await getSweetWord()

        let str = `${today}\n我們相愛(ài)的第${memorialDay}天\n\n元?dú)鉂M滿的一天開(kāi)始啦,要開(kāi)心噢^_^\n\n今日天氣\n${weather.weatherTips}\n${

          weather.todayWeather

        }\n每日一句:<br>${one}<br><br>每日土味情話:<br>${sweetWord}<br><br>————————最愛(ài)你的我`

        try {

          logMsg = str

          await delay(2000)

          await contact.say(str) // 發(fā)送消息

        } catch (e) {

          logMsg = e.message

        }

        console.log(logMsg)

      })

    }

    const padplusToken = '你自己的TOKEN'

    const puppet = new PuppetPadplus({

      token: padplusToken,

    })

    const bot = new Wechaty({

      name: 'jason-assistant',

      puppet,

    })

    bot.use(EventLogger())

    bot.use(QRCodeTerminal({ small: true }))

    //在Wechaty里面引用和配置插件

    const openAIToken = '你自己的機(jī)器人TOKEN' //需要在微信對(duì)話開(kāi)放平臺(tái)申請(qǐng),點(diǎn)擊機(jī)器人設(shè)置》綁定應(yīng)用》在頁(yè)面最下方即可看到

    const openAIEncodingAESKey = '你自己的EncodingAESKey' //微信對(duì)話開(kāi)放平臺(tái)申請(qǐng),點(diǎn)擊機(jī)器人設(shè)置》綁定應(yīng)用》在頁(yè)面最下方即可看到

    const preAnswerHook = async (message: Message) => {

      const isCommonMaterial = await processCommonMaterial(message)

      if (isCommonMaterial) {

        return false

      }

    }

    /**

    * 獲得boss聯(lián)系名片,當(dāng)機(jī)器人找不到問(wèn)題答案時(shí),將BOSS的名片推送過(guò)去

    */

    const getBoss = async () => {

        const contact = bot.Contact.load('boss微信ID')

        await contact.sync()

        return contact

      }

      const noAnswerHook = async (message: Message) => {

        const room = message.room()

        const from = message.from()

        if (!room) {

          const boss = await getBoss()

          await message.say('你的問(wèn)題我不會(huì)回答,你可以聯(lián)系我的老板')

          await message.say(boss)

          return;

        }

        const members = await room.memberAll()

        const bossInRoom = members.find(m => m.id === 'boss微信id')

        if (bossInRoom) {

          await room.say`${bossInRoom},${from}問(wèn)的問(wèn)題我不知道,你幫我回答一下吧。`

        } else {

          const boss = await getBoss()

          await room.say`${from},你的問(wèn)題我不會(huì)回答,你可以聯(lián)系我的老板`

          await room.say(boss)

        }

      }

    /**

    * 用wechaty-weixin-openai可以實(shí)現(xiàn)快速接入微信對(duì)話平臺(tái)

    */

    bot.use(WechatyWeixinOpenAI({

        token: openAIToken,

        encodingAESKey: openAIEncodingAESKey,

        noAnswerHook, //在機(jī)器人無(wú)法回答時(shí),推送設(shè)定的回答

        preAnswerHook, //判斷是否是關(guān)鍵字,如果是關(guān)鍵字,觸發(fā)關(guān)鍵字回答而不接入微信開(kāi)放平臺(tái)

      }))

    const processCommonMaterial = async (message: Message) => {

        const room = message.room()

        // const from = message.from()

        const mentionSelf = await message.mentionSelf()

        const text = message.text()

        let intro = 'Jason,愛(ài)好廣泛,廣交天下豪杰,上得了九天摘月,下得了五洋捉鱉,俗話說(shuō)的好,不會(huì)烘培的飛行員不是好戶外人,不會(huì)玩音樂(lè)的水族愛(ài)好者不是好廚師,不會(huì)畫(huà)畫(huà)的極限愛(ài)好者不是好程序員,這就是我的老板Jason,吼吼吼~~'

        if (room !== null && mentionSelf) {

          if (/jason|你老板|你上司/.test(text)) {

            await room.say(intro)

            await room.say(new UrlLink({

                description: '戶外賤客 & Fighting,fighting,finghting and finghting,讀萬(wàn)卷書(shū),行萬(wàn)里路,學(xué)習(xí)AND吃,喝,玩,樂(lè)',

                thumbnailUrl: '',

                title: 'Jason',

                url: 'http://mp.weixin.qq.com/s?__biz=MzkxODE3MjAyNQ==&mid=100000001&idx=1&sn=d05de320c6fbe6c9f9149a09a4da81ec&chksm=41b4391776c3b001c143ac2c284c58ac8b08de41d95cab682aa5a07022e32096567f5780d5be#rd',

              }))

            return true

          } else if (/戶外賤客/.test(text)) {

            await room.say(new UrlLink({

                description: '戶外賤客 & Fighting,fighting,finghting and finghting,讀萬(wàn)卷書(shū),行萬(wàn)里路,學(xué)習(xí)AND吃,喝,玩,樂(lè)',

                thumbnailUrl: '',

                title: 'Jason',

                url: 'http://mp.weixin.qq.com/s?__biz=MzkxODE3MjAyNQ==&mid=100000001&idx=1&sn=d05de320c6fbe6c9f9149a09a4da81ec&chksm=41b4391776c3b001c143ac2c284c58ac8b08de41d95cab682aa5a07022e32096567f5780d5be#rd',

              }))

            return true

          }

        }

        return false

    }

    // 登錄

    async function onLogin(user) {

      console.log(`貼心小助理${user}登錄了`)

      // 登陸后創(chuàng)建定時(shí)任務(wù)

      await initDay()

    }

    bot.on('login', onLogin)

    bot.start()

      .then(() => log.info('StarterBot', 'Starter Bot Started.'))

      .catch(e => log.error('StarterBot', e))

    ```

    ### 2.創(chuàng)建schedule定時(shí)函數(shù)

    ```typescript

    import { schedule } from 'node-schedule'

    // date 參數(shù)

    //其他規(guī)則見(jiàn) https://www.npmjs.com/package/node-schedule

    // 規(guī)則參數(shù)講解    *代表通配符

    //

    // *  *  *  *  *  *

    // ┬ ┬ ┬ ┬ ┬ ┬

    // │ │ │ │ │  |

    // │ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)

    // │ │ │ │ └───── month (1 - 12)

    // │ │ │ └────────── day of month (1 - 31)

    // │ │ └─────────────── hour (0 - 23)

    // │ └──────────────────── minute (0 - 59)

    // └───────────────────────── second (0 - 59, OPTIONAL)

    // 每分鐘的第30秒觸發(fā): '30 * * * * *'

    //

    // 每小時(shí)的1分30秒觸發(fā) :'30 1 * * * *'

    //

    // 每天的凌晨1點(diǎn)1分30秒觸發(fā) :'30 1 1 * * *'

    //

    // 每月的1日1點(diǎn)1分30秒觸發(fā) :'30 1 1 1 * *'

    //

    // 每周1的1點(diǎn)1分30秒觸發(fā) :'30 1 1 * * 1'

    function setSchedule(date,callback) {

      schedule.scheduleJob(date, callback)

    }

    export function setSchedule()

    ```

    ### 3.創(chuàng)建幾個(gè)功能函數(shù),爬取ONE網(wǎng)站的每日一句,提取通過(guò)API獲取的消息

    ```typescript

    import * as cheerio from 'cheerio'

    import * as superagent from 'superagent'

    const ONE = 'http://wufazhuce.com/' // ONE的web版網(wǎng)站

    const TXHOST = 'http://api.tianapi.com/txapi/' // 天行host

    function req(url,method, params, data, cookies) {

      return new Promise(function (resolve,reject) {

        superagent(method, url)

          .query(params)

          .send(data)

          .set('Content-Type','application/x-www-form-urlencoded')

          .end(function (err, response) {

            if (err) {

            reject(err)

            }

            resolve(response)

          })

        })

    }

    async function getOne() {

      // 獲取每日一句

      try {

        let res = await req(ONE, 'GET')

        let $ = cheerio.load(res.text)

        let todayOneList = $('#carousel-one .carousel-inner .item')

        let todayOne = $(todayOneList[0])

          .find('.fp-one-cita')

          .text()

          .replace(/(^\s*)|(\s*$)/g, '')

        return todayOne

      } catch (err) {

        console.log('錯(cuò)誤', err)

        return err

      }

    }

    async function getTXweather() {

      // 獲取天行天氣

      let url = TXHOST + 'tianqi/'

      try {

        let res = await req(url, 'GET', {

          key: '你自己的KEY',//需要自己去天行申請(qǐng),地址https://www.tianapi.com/signup.html?source=474284281

          city: 'Arlington'

        })

        let content = JSON.parse(res.text)

        if (content.code === 200) {

          let todayInfo = content.newslist[0]

          let obj = {

            weatherTips: todayInfo.tips,

            todayWeather:`阿林頓今天${todayInfo.weather}\n溫度:${todayInfo.lowest}/${todayInfo.highest}

            \n${todayInfo.wind}風(fēng): ${todayInfo.windspeed}\n紫外線指數(shù):${todayInfo.uv_index}\n濕度

            ${todayInfo.humidity}`

          };

          console.log('獲取天行天氣成功', obj)

          return obj

        } else {

          console.log('獲取接口失敗', content.code)

        }

      } catch (err) {

        console.log('獲取接口失敗', err)

      }

    }

    async function getSweetWord() {

      // 獲取土味情話

      let url = TXHOST + 'saylove/'

      try {

        let res = await req(url, 'GET', { key: '' })

        let content = JSON.parse(res.text)

        if (content.code === 200) {

          let sweet = content.newslist[0].content

          let str = sweet.replace('\r\n', '<br>')

          return str

        } else {

          console.log('獲取接口失敗', content.msg)

        }

      } catch (err) {

        console.log('獲取接口失敗', err)

      }

    }

    export { getOne, getTXweather, getSweetWord, }

    ```

    ### 計(jì)算距離某日(生日,結(jié)婚紀(jì)念日等)還有多少天

    ```typescript

    function getDay(date) {

      var date2 = new Date()

      var date1 = new Date(date)

      var iDays = parseInt(

        Math.abs(date2.getTime() - date1.getTime()) / 1000 / 60 / 60 / 24

      )

      return iDays

    }

    function formatDate(date) {

      var tempDate = new Date(date)

      var year = tempDate.getFullYear()

      var month = tempDate.getMonth() + 1

      var day = tempDate.getDate()

      var hour = tempDate.getHours()

      var min = tempDate.getMinutes()

      var second = tempDate.getSeconds()

      var week = tempDate.getDay()

      var str = ''

      if (week === 0) {

        str = '星期日'

      } else if (week === 1) {

        str = '星期一'

      } else if (week === 2) {

        str = '星期二'

      } else if (week === 3) {

        str = '星期三'

      } else if (week === 4) {

        str = '星期四'

      } else if (week === 5) {

        str = '星期五'

      } else if (week === 6) {

        str = '星期六'

      }

      if (hour < 10) {

        hour = '0' + hour

      }

      if (min < 10) {

        min = '0' + min

      }

      if (second < 10) {

        second = '0' + second

      }

      return year + '-' + month + '-' + day + '日 ' + hour + ':' + min + ' ' + str

    }

    export { getDay, formatDate }

    ```

    ![關(guān)鍵字觸發(fā)消息](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/keyword-push.png)

    ![無(wú)法回答推送名片](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/push-contact.png)

    ![定時(shí)推送消息](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/daily-message.png)

    ![智能聊天](https://wechaty.js.org/assets/2020/daily-message-and-chatbot/talk-to-bot.png)

    ## 后記

    到此已經(jīng)實(shí)現(xiàn)了私人人助理和定時(shí)推送消息的功能([項(xiàng)目地址](https://github.com/jasonlovesharon/my_bot)),由于對(duì)Typescript不熟,很多功能都是借鑒很多大神的輪子實(shí)現(xiàn)的,還是對(duì)Python熟悉點(diǎn),下步準(zhǔn)備用Python來(lái)實(shí)現(xiàn)以上功能,并進(jìn)一步拓展更多有趣的功能。

    以上就是關(guān)于itchat怎么一直登錄相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。


    推薦閱讀:

    愛(ài)寫(xiě)作登錄官網(wǎng)(iwrite寫(xiě)作系統(tǒng)登錄學(xué)生官網(wǎng))

    園林景觀設(shè)計(jì)revit(園林景觀設(shè)計(jì)效果圖)

    新微信如何登陸itchat(如何登錄新微信)

    卡通人物形象(卡通人物形象圖片)

    如何快速提升網(wǎng)站關(guān)鍵詞排名(如何提高網(wǎng)站關(guān)鍵詞密度)