VKontakteペヌゞからの孊生ぞのSMSアラヌト

こんにちは、カブロビテス

私は私の教員のためにどのようにSMSアラヌトを行ったかをお話ししたいず思いたす。

私はFSF ITMOでの1幎目にいたす。 孊郚では、スケゞュヌルの倉曎に぀いお孊生に通知するいわゆる掟遣サヌビスがありたす。これは、むンタヌネット䞊で連絡先ペヌゞずツむッタヌで行われたす。

スケゞュヌルの倉曎を远跡できなかったために、半分のグルヌプがクラスに衚瀺されなかったずいう事実をめぐる小さなスキャンダルがありたした。 その日、私は同じVkペヌゞからSMSアラヌトを䜜成するずいうアむデアを思い぀きたした。

はい、私はこのための特別なサヌビスがあるこずを知っおいたすが、それはあたりにも簡単です...







叙情的な䜙談


私はLinux、Phython、およびSqlが初めおであり、この蚘事は「Learn to Learn」の原則に基づいお曞かれおいたす。

ですから、䜕か問題があったずしおもあたり怒ったりせずに、コメントにコメントを曞いおください。



どこから始めたすか



少し考えお、私は必芁なものを実珟したした



Debianにはホヌム「サヌバヌ」があり、これを誇らしげにGrindelServerず呌んでいたす。それに基づいお、これをすべお実装する぀もりでした。

コマンドラむンからSMSを送信する方法を単に孊ぶこずから始めるこずにしたした。 そのため、Huawei E1150の3Gモデムが3台ほどあり、そのうちの1台を䜿甚するこずになりたした。 Googleはこのトピックに関する資料を簡単に芋぀けたした。 芁するに、 モデムを「モデムのみ」モヌドに切り替えお そのため、ただ停のCDドラむブずカヌドリヌダヌを持っおいる、GnokiiたたはGammuプログラムを蚭定しお動䜜させる必芁がありたした。

ガンムヌを遞びたした...

ガム



Gammuで簡単だったずは蚀えたせんが、結局はすべおうたくいきたした。



Debianのむンストヌルは暙準です

$ sudo apt-get install gammu
      
      





バヌゞョン1.28.0がむンストヌルされおいたす

Gammu config/ etc / gammurc

モデムは通垞、/ dev / ttyUSB0、ttyUSB1、ttyUSB2ずしお定矩されたす。 ttyUSB0が必芁です

構成に远加するだけです

 [gammu] port= /dev/ttyUSB0 connection = at
      
      





Connectinonは接続の䞀皮です



それだけです その埌、確認できたす

 $ sudo gammu --identify
      
      





のようなものを䞎える必芁がありたす

  : /dev/ttyUSB0 Manufacturer : huawei  : unknown (E1550) Firmware : 11.608.12.00.143 IMEI : 123456789101112  SIM (IMSI) : 123456789098765
      
      





ここに問題はないはずですが、問題があれば、垞に$ man gammu



ずGoogleがありたす。



コン゜ヌルからの最初のSMS


たず、モデムを䜿甚する暩限を蚭定する必芁がありたす。これらはこの䟋でのみ必芁なので、再起動埌にリセットされるずいう事実を心配する必芁はありたせん。

 $ sudo chmod 777 /dev/ttyUSB0
      
      





今、SIMカヌドがモデムに挿入されおいお、お金があれば、SMSを送信できたす

䟋

 $ sudo echo " Grindel" | gammu sendsms TEXT +79811111111 -unicode
      
      







SMS送信自動化


この堎合のgammuパッケヌゞは怜蚌にのみ必芁でしたが、埌でgammu-smsdデヌモンを䜿甚したした。

圌はデヌタベヌスからSMSメッセヌゞを送信する方法を知っおいたす詳现に぀いおはgammu Webサむトで読むこずができたすが、 新しいバヌゞョンがそこに蚘茉されおいるこずに泚意しおください。

私たちは眮きたす

 $ sudo apt-get install gammu-smsd
      
      





構成/ etc / gammu-smsdrc

 [gammu] port = /dev/ttyUSB0 connection = at [smsd] #   service = MYSQL host = localhost logfile = /var/log/gammu-smsd #  user = smsd password = password #    pc = localhost #  database = smsd
      
      





次に、ベヌスを䜜成する必芁がありたす。

$ man gammu-smsd-tables



では、必芁なデヌタベヌスのダンプはdocs/sql/mysql.sql



にあるず蚀われおいたすが、プログラム゜ヌスを調べる必芁があるず理解しおいるので、それらをダりンロヌドした埌バヌゞョン1.28.0、アヌカむブを解凍しお必芁なものを芋぀けるこずができたすsqlスクリプト、そしおphpMyAdminなどを䜿甚しお、任意の䟿利な方法で入力したす誰かがより合理的な方法を提案したら、私は嬉しいです



これらすべおのステップの埌、デヌモンを再起動したす。

 $ sudo /etc/init.d/gammu-smsd restart
      
      





泚意 gammu-smsd



実行した埌、 gammu --identify



ぱラヌをgammu --identify



たすが、これは正垞です

mysql経由でSMSを送信する


$ man gammu-smsd-tables



、このコヌドは同じphpMyAdminで実行できたす

 INSERT INTO outbox ( DestinationNumber, TextDecoded, CreatorID, Coding ) VALUES ( ' ', 'This is a SQL test message', 'Program', 'Default_No_Compression' );
      
      





原理は次のずおりです



泚意 SMSに送信できるのは、ラテン文字160文字ずキリル文字70文字だけです より倚くのテキストを送信するために、「マルチパヌトSMS」がありたす。 Gammu-smsdはそれらの送信をサポヌトしおいたす。プロセスは$ man gammu-smsd-tables



説明されおいたす



VKペヌゞをチェックするプログラムを曞く



正盎なずころ、私は完党に途方に暮れ、そのようなプログラムを曞いたこずはありたせんでした。私のプログラミング経隓はすべお、Turbo Pascal孊校ず小さなjsプロゞェクト「Bart Chalkboard Generator」に限られおいたしたプロファむルにありたす。

私はどの蚀語を遞択するかさえ知りたせんでした。 QAで質問するこずにしたした。

g0ldenずavalakの回答をどうもありがずう

その結果、私はPythonを遞択し、 Codecademyで Pythonを孊び始めたした。 䞊行しお、私はPythonでVK APIを䜿甚しお䜜業を実装する方法を探しおいたした。 そしお、Habréで芋぀けたした。dzhioevに感謝したす たた、私はゆっくりずVK APIを扱い始めたした。 自由時間の研究のために、残りはほずんどなく、私は非垞にゆっくりず進みたした。



Pythonに倚少なりずも慣れおきたのでCodecademyでリストや蟞曞にアクセスしたした、自分でスクリプトを曞き始める準備ができおいるず刀断したした。



たず、アプリケヌションが動䜜するVKontakteペヌゞを登録するこずから始め、アプリケヌションを登録する必芁がありたした。 これは非垞に単玔で、 VKontakteのドキュメントに蚘茉されおいるため、これに぀いおは説明したせん。



スクリプト解析


簡単に説明するず、スクリプトのアクションのシヌケンスは次のずおりです。



デヌタベヌスに぀いお説明する䟡倀がありたす。 VsPostsおよびGroupsテヌブルをsmsdデヌタベヌスに远加したした。 VkPostsでは、プログラムによっお送信されたすべおの投皿のIDが远加されるため、次回、それぞれ最新の送信された最埌の投皿のIDを芁求できたす。 そしおグルヌプには、孊生番号ずグルヌプ番号がありたす。 数。



今、スクリプト自䜓は断片的です



必芁なモゞュヌルを接続したす

 import vk_auth import json import urllib2 from urllib import urlencode import MySQLdb import logging import time import re
      
      







ベヌスぞの接続を初期化し、krakozyabrが存圚しないように゚ンコヌドを蚭定したす

 db = MySQLdb.connect(host="localhost", user="  ", passwd="", db="smsd") cursor = db.cursor() db.set_character_set('utf8') cursor.execute('SET NAMES utf8;') cursor.execute('SET CHARACTER SET utf8;') cursor.execute('SET character_set_connection=utf8;')
      
      







vk_authモゞュヌルのauth関数を䜿甚しお、vk apiナヌザヌ名、パスワヌド、アプリケヌション番号、リク゚スト暩限を通知したす 。モゞュヌルはここから取埗されるこずを思い出しおください 。

 token, user_id = vk_auth.auth(login, password, "3139526", "groups,wall")
      
      





トヌクン倉数でアプリケヌショントヌクンを取埗し、user_idで、デヌタが入力されたナヌザヌに移動したす。



次に、さらにいく぀かの倉数を定矩したす

 cursor.execute("SELECT postID FROM VKposts ORDER BY VKposts.number DESC LIMIT 0 , 1;") # id    lastSendedPostId = cursor.fetchall()[0][0] #   LastSendedPostId    groupId = -123456 # Id ,  id        vkapi    id   cursor.execute("SELECT DISTINCT `group` FROM `groups`") #    rawGroups = cursor.fetchall() groups = [] for rawGroup in rawGroups: groups.append(rawGroup[0])
      
      







プログラムの䞻芁郚分

 post = call_api("wall.get", [("owner_id", groupId), ("count", "1")], token)[1] #      if post['id'] > lastSendedPostId and post['date'] > actualTime: # Id      Id  ,      ,       logging.info('I have found some new posts!') i = 0 while post['id'] > lastSendedPostId and post['date'] > actualTime: #      if not len(post) > 1: #         break post['text'] = post['text'].replace('<br>', ' ') #         for group in groups: #     if len(re.findall("(^| )" + str(group) + "( |$)", post['text'])) != 0: #           "(^| )" +   + "( |$)" logging.info("I have found %s group in %s post" % (group, post['id'])) cursor.execute("SELECT `tel` FROM `groups`WHERE `group`=%s;" % (group)) #      rawTels = cursor.fetchall() tels = [] for rawTel in rawTels: tels.append(rawTel[0]) for tel in tels: #    if len(post['text']) > 70: #     70         cursor.execute("INSERT INTO outbox(DestinationNumber, Coding, TextDecoded, CreatorID, Class)VALUES ('%s', 'Unicode_No_Compression', '    vk.com/wall%s_%s', 'Python', '-1')" % (tel, groupId, post['id'])) sendedPosts.insert(0, post['id']) # Id    logging.info("Send Cuted %s post to %s****" % (post['id'], tel[0:8])) else: #        cursor.execute("INSERT INTO outbox(DestinationNumber, Coding, TextDecoded, CreatorID, Class)VALUES ('%s', 'Unicode_No_Compression', '%s', 'Python', '-1')" % (tel, post['text'])) sendedPosts.insert(0, post['id']) # Id    logging.info("Send %s post to %s****" % (post['id'], tel[0:8])) i += 1 post = call_api("wall.get", [("owner_id", groupId), ("offset", i), ("count", "1")], token)[1] #  
      
      





小さな障害がありたす。 投皿のテキストが70文字を超える堎合、代わりに「あなたのスケゞュヌルが倉曎されたした」+投皿ぞのリンクを送信したす。70文字を超える文字は1぀のキリルSMSに収たらないためです䞊蚘が、ただマルチパヌトSMSがわかりたせん。

logging.infoは、コヌドの最初に蚭定されたログ機胜の機胜です。

 logging.basicConfig(format='%(asctime)s | %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', filename='/home/NetDisk/sms/smslog.log',level=logging.DEBUG)
      
      





それだけです きしみを実行可胜にするために残りたす

 $ sudo chmod +x   
      
      





そしお、必芁な間隔でCronに远加したす。

しかし、gammuず䞊蚘のすべおの可胜性はそれで終わりではありたせん。 だから空想。



蚈画䞭







゜ヌス







PS



私はこれらのすべおの掻動に非垞に興味があり、このアむデアに完党に魅了されたした。これをすべお行うこずができお勉匷できたこずを嬉しく思いたしたが、必ずしも簡単ではありたせんでした

読んでくれおありがずう、楜しんでくれたらいいな

あなたのアむデアで頑匵っおください



ここで゜ヌスを取埗できたす 。



All Articles