私たちはak子について思い出させるためにVkontakteに依頼します

今日、私は再び特定の時間に重要なことを人に思い出させるように頼まれました。 しかし、自分の事柄をいつも忘れていて、さらに他の誰かの事柄を忘れたらどうでしょうか? そして、ここで私のお気に入りのpythonが再び助けてくれました。







正直なところ、通常のリマインダープログラムは、デバイスの範囲が限られているために電話やコンピューターで私に合わなかったため、何かを思い出す必要があるときは問題を解決できませんでした。 決定はどういうわけか単独で行われました。 しかし、リマインダーがVKontakteメッセージとして届くとどうなりますか? 私が職場にいない場合、電話はプッシュアップ通知で振動し、コンピューターではそれがさらにはっきりします。 目標は、私のリマインダメッセージを読み取り、実際に必要なものを必要とする人を思い出させるスクリプトを書くことです。 さて、アイデアが生まれたら、それを実装します。



始める



注意! この記事では、Vkontakte APIを使用せずにこれを行う方法を示します。 しかし、実際にAPIを使用してこれがどのように行われるかを見たい(または使用したい)人のために、APIを介して動作するスクリプトのバージョンを添付しています。 記事の最後にリンクします。



まず、このソーシャルネットワークにログインするスクリプトを教えます。 シンプルで、標準のmechanize.Browser()を使用します



br = mechanize.Browser() br.set_handle_equiv(True) br.set_handle_redirect(True) br.set_handle_robots(False) br.open('https://vk.com/') br.select_form(nr=0) br.form['email'] = name br.form['pass'] = password br.submit()
      
      





出来上がり! VKontakteページに行きました。 ここでVKontakteのクールな機能を使用します-自分自身に書き込む機能(これを行う方法がわからない場合は、 vk.com / im?sel = idにアクセスします。ここでidはソーシャルネットワークのIDです。私の場合は38591009でした)。



まず、これらのメッセージを読んでください。 これを行うには、IDを見つける必要があります(メインページのコード内にあり、何度も繰り返されます)。



 self_username = 'username' def get_self_page_id(br): br.open('https://vk.com/'+self_username) return br.response().read().split('<form action="/wall')[1].split('?')[0] def check_messages(br): br.open('https://vk.com/im?sel='+get_self_page_id(br)) response = br.response().read()
      
      





自分に送信したメッセージから最後の20メッセージが表示されます。 これで十分です。 各メッセージには独自の(ユーザーにとって)固有の番号があり、非常に便利です。 次に、それらを少し遊んで、すべてのメッセージを分離し、テキストをシリアル番号から分離し、どのメッセージが新規で関連性がなくなったかをスクリプトに教えます。



 first_start = True msg_numbers = [] # .  ,    ,    . def play_with_messages(br, response): global first_start all_messages = response.split('class="messages bl_cont">')[1].split('<div id="mfoot"')[0].split('<a name="msg') all_numbers = [] global msg_numbers for msg in all_messages: if msg != all_messages[0]: msg_num = msg.split('">')[0] all_numbers.append(msg_num) if first_start: msg_numbers = all_numbers first_start = False new_numbers = set(all_numbers) - set(all_numbers).intersection(set(msg_numbers)) for num in new_numbers: reply_to_message(br, get_message_text(response, num)) #    .   . msg_numbers = all_numbers
      
      





内部対話を開始する



素晴らしい。 これで、私が最近受け取ったメッセージがわかりました。 それらを理解し、それに応じて何かをすることが残っています。 最初のタスクから始めましょう。



 def reply_to_message(br, message): if message.find('') == -1: print 'nothing' else: print 'I obey, my lord' ms_words = message.split(' ') user = 'self' time_s = datetime.datetime.now().strftime('%H:%M') day_s = str(datetime.date.today()) msg = 'something went wrong' times = message.split('|') if len(times) == 1: times = '1' else: times = int(times[1]) if ms_words[1] == '': user = 'self' time_s = ms_words[2] msg = message.split(' ')[1].split('|')[0] elif ms_words[1] == '': user = 'self' time_s = ms_words[4] day_s = ms_words[2] msg = message.split(' ')[1].split('|')[0] elif ms_words[2] == '': user = get_page_id(br, ms_words[1]) time_s = ms_words[3] msg = message.split(' ')[1].split('|')[0] elif ms_words[2] == '': user = get_page_id(br, ms_words[1]) time_s = ms_words[5] day_s = ms_words[3] msg = message.split(' ')[1].split('|')[0] let_it_do(user, time_s, day_s, msg, times) # ,  ,       .
      
      





ここで、受信したメッセージをリストし、対応する値を変数に入力します。 一般的に、「誰に思い出させるべきですか?」、「何を思い出させるべきですか?」、「いつ、何回これをしますか?」という質問に答えます。 メッセージ/コマンドの構文は複雑ではありませんでした:[時間]テキスト[メッセージテキスト] | [何回]で[日付]を思い出させます。 例は次のとおりです。「14:10テキストにtenoclockを思い出させる 4 "



ロボットは内部の対話を見る



ジョブを保存するために、sqlite3データベースを選択しました。 最小限の負荷で、完全に楽に展開します。 次に、データベースへのタスクの書き込みを開始し、途中で日付と時刻の有効性を確認します。 次のようになります。



 def valid_time(time_text): try: datetime.datetime.strptime(time_text, '%H:%M') return True except ValueError: send_message(br_fake, get_self_page_id(br), '  ') return False def valid_date(date_text): try: datetime.datetime.strptime(date_text, '%Y-%m-%d') return True except ValueError: send_message(br_fake, get_self_page_id(br), '  ') return False def let_it_do(user, time_s, day_s, message, times): if valid_time(time_s) and valid_date(day_s): c = conn.cursor() c.execute("INSERT INTO reminder (time, date, user, message, times) VALUES (?,?,?,?,?)",(time_s, day_s, user, message, str(times))) conn.commit()
      
      





フィニッシュライン



私たちはすでにフィナーレに近づいています! 私たちのロボットはタスクを受け取り、自分で書き留めました。 実際、それを実現するだけです。 その後、私は少し困難に遭遇しました。 スクリプトは常に私のメッセージを読み取ります。したがって、彼が同じダイアログにメッセージを送信した場合、未読メッセージに何もハングアップしません。 そしてこれは悪いです。 この問題は、このケースの偽のアカウントを設定することで解決しました。 スクリプトが何かを思い出させた場合、彼は2番目のアカウントから書き込みますが、他の誰かに通知する必要がある場合は、人を怖がらせないように、私に代わって書き込みます。



実際、データベースからの読み取りとメッセージの送信を担当する関数がいくつかあります。



 def check_answers(): conn = sqlite3.connect('reminder.db') rows = get_rows(conn) for row in rows: print row[5] c = conn.cursor() if row[3] == 'self': pass send_message(br_fake, get_self_page_id(br), row[4].encode('utf-8')) else: send_message(br, row[3], row[4].encode('utf-8')) if row[5] == '1' or row[5] == 1: c.execute("DELETE FROM reminder WHERE id = ?;", str(row[0])) else: time_s = (datetime.datetime.now()+datetime.timedelta(seconds=60)).strftime('%H:%M') num = int(row[5]) - 1 c.execute("UPDATE reminder SET time = ?, times = ? WHERE id = ?",(time_s, str(num), row[0])) conn.commit() def send_message(br, id, message): br.open('https://vk.com/im?sel='+id) br.select_form(nr=0) br.form['message'] = message br.submit()
      
      





スクリプトは、メッセージを送信した後、関連性がない場合、データベースからレコードを削除します(さらに数回繰り返す必要がある場合、リマインダー時間を1分先に転送し、残りの送信数を減らします)



まとめると



したがって、200行のコードに収まるスクリプトは、ソーシャルネットワークVKontakteを使用して自分自身や他の人に思い出させる問題を解決します。 ここから完全にダウンロードできます。 誰かが突然誰かを必要としている場合、私はあなたが作品から記事を収集しないようにアドバイスします。ここでは機能的なものだけです。 いくつかの補助部品が残りました。 私は私のvpsでそれを実行しました。 これまでのところ、それは一種の便利です。





ロボットは何をすべきかを教えてくれます。 日曜日! 生き残った



簡単な変更後、スクリプトがリモートコンピューターで実行されている場合は、ここで他のシステム管理機能も含めることができます。 たとえば、ダウンロード用に同じトレントを入れます。 したがって、一般に、尋ねるすべての人(実際、ボット、ircやicqのように既に忘れられている)のリマインダーを処理するWebサービスを実装できますが、これらのことはこの記事には関係ありません。 それが誰かに役立つなら、私はとても幸せです。



ご清聴ありがとうございました。



UPD:トーチを軽く動かして、APIについての熊手を鋭くしないでください。 都合の悪い場所があるため、このスクリプトでは意図的に使用していません。 つまり、認証とダイアログの操作。 ただし、最初のコメントでこのトピックを開きました。 この記事の目的は、サードパーティの情報を使用せずに、言語の開発者の母国語を知っていることにより、生活を少し楽にする方法を迅速かつ実用的に示すことです。



UPD#2:同じスクリプトですが、強力なVkontakte APIを使用すると、 ここから入手できます 。 今では、偽のアカウントを使用せずに動作します。 これは明確なプラスです。



All Articles