VKontakte पेज से छात्रों के लिए एसएमएस अलर्ट

नमस्कार प्रिय ख़बरोवीस!
मैं आपको बताना चाहता हूं कि मैंने अपने संकाय के लिए एसएमएस अलर्ट कैसे किया।
मैं एफएसएफ आईटीएमओ में अपने पहले वर्ष में हूं। हमारे पास संकाय में एक तथाकथित प्रेषण सेवा है, जो छात्रों को अनुसूची में बदलाव के बारे में सूचित करने में लगी हुई है, इंटरनेट पर यह संपर्क पृष्ठ और ट्विटर के माध्यम से किया जाता है।
एक बार इस तथ्य पर एक छोटा सा घोटाला था कि एक आधा समूह इस तथ्य के कारण कक्षाओं के लिए प्रकट नहीं हुआ था कि वे अनुसूची में परिवर्तन को ट्रैक करने का प्रबंधन नहीं करते थे। उस दिन, मुझे उसी Vk पृष्ठ से एक एसएमएस अलर्ट बनाने का विचार था।
हां, मुझे पता है कि इसके लिए विशेष सेवाएं हैं, लेकिन यह बहुत आसान है ...



गीतात्मक विषयांतर

मैं लिनक्स, Phython और Sql के लिए नया हूं, और यह लेख "सीखने के लिए जानें" के सिद्धांत पर लिखा गया है।
इसलिए कुछ गलत होने पर बहुत ज्यादा गुस्सा न करें, बल्कि सिर्फ अपनी टिप्पणी टिप्पणियों में लिखें।

कहाँ से शुरू करें?


थोड़ा विचार के साथ, मुझे एहसास हुआ कि मुझे क्या चाहिए:

मेरे पास डेबियन पर एक घर "सर्वर" है जिसे मैं गर्व से ग्रिंडेलसेवर कहता हूं, इसके आधार पर मैं यह सब लागू करने जा रहा था।
यह केवल कमांड लाइन से एसएमएस भेजने का तरीका सीखने के द्वारा शुरू करने का निर्णय लिया गया था। ऐसा हुआ कि मेरे पास Huawei E1150 के लगभग 3 जी मॉडेम पड़े थे, उनमें से एक का उपयोग करने का निर्णय लिया गया। Google को इस विषय पर आसानी से सामग्री मिली। संक्षेप में, मॉडेम को "केवल मॉडेम" मोड पर स्विच किया जाना था (इसलिए उनके पास अभी भी एक नकली सीडी ड्राइव और कार्ड रीडर है), और फिर इसके साथ काम करने के लिए Gnokii या Gammu प्रोग्राम को कॉन्फ़िगर करें।
मैंने गम्मू को चुना ...

Gammu


मैं यह नहीं कह सकता कि यह गम्मू के साथ आसान था, लेकिन अंत में सब कुछ काम कर गया।

डेबियन स्थापना मानक है:
$ sudo apt-get install gammu 

मेरे पास संस्करण 1.28.0 स्थापित है
Gammu config: / etc / gammurc
मॉडेम को आमतौर पर / dev / ttyUSB0, ttyUSB1, ttyUSB2 के रूप में परिभाषित किया जाता है। हमें ttyUSB0 की आवश्यकता है
बस विन्यास में जोड़ें
 [gammu] port= /dev/ttyUSB0 connection = at 

कनेक्टिनन एक प्रकार का कनेक्शन है

वह सब है! उसके बाद आप जांच कर सकते हैं
 $ sudo gammu --identify 

कुछ इस तरह देना चाहिए
  : /dev/ttyUSB0 Manufacturer : huawei  : unknown (E1550) Firmware : 11.608.12.00.143 IMEI : 123456789101112  SIM (IMSI) : 123456789098765 

यहाँ कोई समस्या नहीं होनी चाहिए, लेकिन अगर वहाँ हैं, तो हमेशा $ man gammu और Google है।

कंसोल से पहला एसएमएस

पहले आपको मॉडेम का उपयोग करने के लिए अधिकार निर्धारित करने की आवश्यकता है, उन्हें केवल इस उदाहरण के लिए आवश्यक होगा, इसलिए इस तथ्य के बारे में चिंता न करें कि वे रिबूट के बाद रीसेट हो गए हैं।
 $ sudo chmod 777 /dev/ttyUSB0 

अब, यदि मॉडेम में एक सिम कार्ड डाला गया है और उस पर पैसा है, तो आप एसएमएस भेज सकते हैं
उदाहरण के लिए:
 $ sudo echo " Grindel" | gammu sendsms TEXT +79811111111 -unicode 


एसएमएस ऑटोमेशन भेज रहा है

इस मामले में गंबू पैकेज केवल सत्यापन के लिए आवश्यक था, बाद में मैंने गंबू-एसएमडी डेमॉन का उपयोग किया।
वह जानता है कि डेटाबेस से एसएमएस संदेश कैसे भेजे जा सकते हैं (आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं gammu वेबसाइट पर, लेकिन ध्यान दें कि बाद के संस्करण का वर्णन किया गया है।)
हम डालते हैं:
 $ sudo apt-get install gammu-smsd 

विन्यास / आदि / 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 के माध्यम से

$ man gammu-smsd-tables से उदाहरण, इस कोड को एक ही phpMyAdmin में निष्पादित किया जा सकता है
 INSERT INTO outbox ( DestinationNumber, TextDecoded, CreatorID, Coding ) VALUES ( ' ', 'This is a SQL test message', 'Program', 'Default_No_Compression' ); 

सिद्धांत इस प्रकार है

चेतावनी! केवल 160 लैटिन और 70 सिरिलिक पात्रों को एसएमएस भेजा जा सकता है! अधिक पाठ भेजने के लिए, "मल्टीपार्ट एसएमएस" हैं। Gammu-smsd उन्हें भेजने का समर्थन करता है, इस प्रक्रिया का वर्णन $ man gammu-smsd-tables

Vk पृष्ठों की जांच करने के लिए अपना कार्यक्रम लिखना


सच कहूं तो, मैं पूरी तरह से एक नुकसान में था, मैंने ऐसे कार्यक्रम कभी नहीं लिखे, मेरे सभी प्रोग्रामिंग अनुभव स्कूल टर्बो पास्कल और एक छोटे से जेएस प्रोजेक्ट "बार्ट चॉकबोर्ड जनरेटर" तक सीमित थे (मेरी प्रोफ़ाइल में पाया जा सकता है)।
मुझे यह भी नहीं पता था कि किस भाषा का चयन करना है। प्रश्नोत्तर में प्रश्न पूछने का निर्णय लिया गया।
G0lden और हिमस्खलन के जवाब के लिए बहुत बहुत धन्यवाद!
नतीजतन, मैंने पायथन को चुना और कोडेक अकादमी में इसे सीखना शुरू कर दिया। समानांतर में, मैं पायथन में वीके एपीआई के साथ काम को लागू करने के तरीके की तलाश कर रहा था। और मैं इसे Habré पर पाया, इसके लिए धन्यवाद dzhioev ! इसके अलावा, मैंने धीरे-धीरे वीके आपी के साथ व्यवहार करना शुरू किया। खाली समय के अध्ययन के कारण, बहुत कम बचा था और मैं बहुत धीरे-धीरे आगे बढ़ा।

पायथन के कमोबेश परिचित होने के बाद (कोडेक अकादमी में मुझे सूचियों और शब्दकोशों में मिला), मैंने फैसला किया कि मैं अपनी स्क्रिप्ट लिखना शुरू करने के लिए तैयार हूं।

मैंने एक VKontakte पृष्ठ पंजीकृत करके शुरू किया था, जिसकी ओर से आवेदन संचालित होगा, तब मुझे अपना आवेदन पंजीकृत करने की आवश्यकता थी। यह काफी सरल है और VKontakte के प्रलेखन में वर्णित है, इसलिए मैंने इसके बारे में नहीं लिखा।

स्क्रिप्ट पार्सिंग

संक्षेप में, स्क्रिप्ट की क्रियाओं का क्रम इस प्रकार है:

यह डेटाबेस के बारे में समझाने लायक है। मैंने smsd डेटाबेस में VkPosts और Group tables जोड़े। VkPosts में, प्रोग्राम द्वारा भेजी गई सभी पोस्टों की आईडी को जोड़ा जाता है, इसलिए अगली बार जब आप भेजे गए अंतिम पोस्ट की आईडी का अनुरोध कर सकते हैं, तो नवीनतम के। और समूहों में छात्र संख्या और समूह संख्या हैं: समूह | नंबर।

अब स्क्रिप्ट ही टुकड़ा-टुकड़ा है

हम आवश्यक मॉड्यूल कनेक्ट करते हैं
 import vk_auth import json import urllib2 from urllib import urlencode import MySQLdb import logging import time import re 


आधार से कनेक्शन शुरू करें, और एन्कोडिंग सेट करें ताकि कोई क्राकोज़ीबार न हो
 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 मॉड्यूल से कई फ़ंक्शन का उपयोग करके 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 से अधिक वर्ण एक सिरिलिक एसएमएस (जैसा कि ऊपर उल्लेख किया गया है) में फिट नहीं होंगे, लेकिन मुझे अभी भी मल्टीपार्ट एसएमएस का पता नहीं चला है। ।
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    

और आवश्यक अंतराल के साथ क्रोन में जोड़ें।
लेकिन गमू और उपरोक्त सभी की संभावनाएं समाप्त नहीं होती हैं, और तुम्हारा, मुझे यकीन है, भी। तो कल्पना करो।

योजनाओं में




सूत्रों का कहना है




पुनश्च


मुझे इन सभी गतिविधियों में बहुत दिलचस्पी थी, मैं इस विचार से पूरी तरह से मोहित हो गया था, मुझे यह सब करने और अध्ययन करने में सक्षम होने की खुशी थी, हालांकि यह हमेशा आसान नहीं था (कभी-कभी मैं यह सब छोड़ देना चाहता था)।
पढ़ने के लिए धन्यवाद, मुझे आशा है कि आपको यह पसंद आया होगा!
आपके विचारों के साथ शुभकामनाएँ!

स्रोत को यहां ले जाया जा सकता है

Source: https://habr.com/ru/post/In153893/


All Articles