äžæ¹ã§ãç§ã®å人ã®ã»ãšãã©ã¯VKontakteã䜿çšããŠãããæ£çŽã«ããã§é³æ¥œãèŽããŠãã¥ãŒã¹ãèªãã®ã奜ãã§ãã æããã«ã2ã€ã®ç°ãªããœãŒã·ã£ã«ãããã¯ãŒã¯ã§èªåèªèº«ãæžãã®ã¯äžäŸ¿ã§ãããããèªååããå¿ èŠããããŸã-ã¯ãã¹ã·ã§ã¢ãªã³ã°ïŒè»¢éåŸïŒã䜿çšããŸãã
以äžã¯ãããŸãäžè¬çã§ã¯ãªãã¯ãã¹ã·ã§ã¢ãªã³ã°æ¹æ³ã®ç°¡åãªèª¬æã§ãã
ããå°ãèæ¯
以åã¯ãIFTTTã䜿çšããŠã¬ã³ãŒãã転éããŸããã ããŸã䟿å©ã§ã¯ãããŸããã§ãã-æçš¿ã¯15åããšã«å»¶æãããç¹æ®æåããšã³ã³ãŒãããïŒãã«å€æïŒquot;ãïŒããªã³ã¯ãççž®ãããŸããïŒt.coïŒ-Vkontakteã¯ãããã®ãªã³ã¯ããã©ãããšãããšãã«èªããŸããããã ããTwitter APIã®æè¿ã®å€æŽã«ããIFTTT ã¯ããã€ãŒããèªã¿åããã¬ã·ããããªãã«ããããšãäœåãªããããŸãã ãããã¯åžžã«ã§ã¯ãããŸããïŒæããã«å㳠圌ãã¯ãªã¯ãšã¹ãã®æ°ã«é¢ããæ°ããTwitter APIã®å¶éã«åãçµã¿ãŸããïŒãããã«ãªã³ã¯ã«åé¡ããããŸããã
ãã¡ãããæãç°¡åãªæ¹æ³ã¯ãã¬ã³ãŒãã転éããã¹ã¯ãªããã䜿çšããããšã§ãã ããã©ãŒã§ãã¯ãã¹ã·ã§ã¢ãªã³ã°ã®ããŸããŸãªæ¹æ³ã«ã€ããŠç¹°ãè¿ã æžããŸãããããããã®æ¹æ³ã¯ãã¹ãŠãèªåã®ãµãŒããŒããªãç¶æ ã§äŒã¿ãŸããã 1ã€ã®ã·ã³ãã«ãªã¹ã¯ãªããã§ææã®ãã¹ãã£ã³ã°ïŒå®äŸ¡ã§ã¯ãããŸããïŒãè³Œå ¥ããããšã¯ã»ãšãã©æå³ããããŸããã
ãããæè¿ãã«ãŒã¿ãŒã®ãã¡ãŒã ãŠã§ã¢ã®æ°ããããŒãžã§ã³ãæ¢ããŠã€ã³ã¿ãŒããããã¯ããŒã«ããZyxel Keeneticã«åºã¥ããŠå°ããªWebãµãŒããŒãäœæã§ããããšã«æ°ä»ããŸããïŒ è³Œå ¥ããåã«ãã«ãŒã¿ãŒã®ãããã®æ©èœã«ã€ããŠèªã¿ãŸããããã©ããããããé ããé£ã³åºããŸããã ãããŠãç§ã¯èšç»ããããããžã§ã¯ãã®å®è£ ãéå§ããŸãã-ã«ãŒã¿ãŒã䜿çšããŠTwitterããVkontakteãžã®ã¯ãã¹ã·ã§ã¢ãªã³ã°ã
ã¢ã¹ã¯ã¯ã¯ããã«æ§ç¯ããŸããã§ãã
ãŸããZyxel Keeneticã®æ©èœã«ã€ããŠå°ãã話ããŸãã ã€ãŸããããŸããŸãªæ¢è£œã®ã¢ãžã¥ãŒã«ïŒphpãlighttpdãdlnaãtransmissionãperlãpythonãªã©ïŒãã«ãŒã¿ãŒã«ãã°ãããç°¡åã«ãå®å šã«ã€ã³ã¹ããŒã«ã§ããŸãã ãã©ãŒã©ã ã§è©³çŽ°ãèªãããšãã§ããŸãã
ãããžã§ã¯ããéå§ããåã«ããŠã£ãã·ã¥ãªã¹ãã®ãªã¹ããäœæããŸããã ã¹ã¯ãªããã¯æ¬¡ã®ããšãã§ããã¯ãã§ãã
- ãã€ãŒãã衚瀺ãããçŽåŸããŸãã¯cronãä»ããŠã¹ã¯ãªãããå®è¡ãããšãã«ãã€ãŒãã転éãã
- åçããªãã€ãŒããåç §ã転éããªã
- ã€ã¶ããããã¹ãã®t.coççž®ãªã³ã¯ãå±éãã
- å¯èœã§ããã°ãæ·»ä»ãããåçãã³ããŒããŸãïŒäŸïŒInstagramïŒ
ãŸããã¹ã¯ãªããèšèªãéžæããå¿ èŠããããŸããã ã«ãŒã¿ãŒã«ã¯Perlã¢ãžã¥ãŒã«ãšPythonã¢ãžã¥ãŒã«ããããŸããããããã®èšèªã«ãç§ã¯äžæ £ãã§ããã ãŸããTwitter APIãšVkontakte APIã«åºããããããšããªãã£ãã®ã§ãäž»ã«ãããã䜿çšããæ¢è£œã®äŸã«èå³ããããŸããã 幞ããªããšã«ããã®ãããªã¹ã¯ãªããã¯ãããäžã§ååã«èŠã€ãããŸããã ã©ããããããç§ã¯Perlãéžãã :)
ãã®åŸãTwitter APIã®ããã¥ã¡ã³ããšäŸã«çŽæ¥é²ã¿ãŸããã ãåç¥ã®ããã«ãã¹ããªãŒãã³ã°ãšRESTã®2ã€ã®ã¿ã€ãããããŸãã æè¿ã®APIã®å€æŽã§ã¯ãéçºè ãStreaming APIã«ç§»è¡ããããšããTwitterã®èŠæãã¯ã£ãããšçŸããŠããŸãã ãããã£ãŠãå°æ¥åé¡ãçºçããªãããã«ãã¹ããªãŒãã³ã°ã䜿çšããããšã決å®ãããŸããã
ã¹ã¯ãªããã¯èªåå°çšã«äœæãããããã¢ã¯ã»ã¹ããŒã¯ã³ã¯ååŸããŸããã§ããããTwitterã¢ããªã±ãŒã·ã§ã³ã®èšå®ããŒãžããããã«ååŸããŸããã æ°æéã®ãã¡ã«ã perlã¢ãžã¥ãŒã«ã®å©ããåããŠããã€ãŒãã衚瀺ããç°¡åãªã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãäœæãããŸããã ãã¹ãŠãç§ã®ã³ã³ãã¥ãŒã¿ãŒã§ããŸããããŸããã ã«ãŒã¿ãŒã確èªããããã«ãå¿ èŠãªãã¹ãŠã®ããã±ãŒãžãã€ã³ã¹ããŒã«ãïŒç§ã«ã¯æããããã«ïŒãã¹ã¯ãªãããå®è¡ããŸããããäœããããŸããã§ããã åäœããŸããã Perlã§å©çšå¯èœãªãã¹ãŠã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãããã圹ã«ç«ã¡ãŸããã§ããã ãšã©ãŒã®ããã¹ããã°ãŒã°ã«ã§èª¿ã¹ãŠã¿ããšãåé¡ã®åå ã¯ããããäœããã®perlã¢ãžã¥ãŒã«ã®æ¬ åŠã«ããããã®çµæãã¹ã¯ãªããã¯SSLã§æ£ããåäœã§ããªãããšãããããŸããã æçµçã«ãPerlãé¢ããŠPythonãè©Šãããšã«ããŸããã
Perlã¯æ»ãã§ããŠãé·çãããPython
ç§ã¯PyCharmãããŠã³ããŒãããæ§æã®ç 究ãå§ããŸããã æ£çŽãªãšããã.NETã®åŸãã€ã³ãã³ãããããã¯æå®ãšããŠäœ¿çšããããšã«ã·ã§ãã¯ãåããŸãã:)æ§æãç解ãã tweepyã¢ãžã¥ãŒã«ãèŠã€ããããã«ç§ã®ãã€ãŒãåºåã¹ã¯ãªãããPythonã§æžãçŽããŸããã ã«ãŒã¿ãŒã«Pythonããã±ãŒãžãã€ã³ã¹ããŒã«ããã¹ã¯ãªãããå®è¡ããŸã-ãããå¥è·¡ã§ãïŒ åäœããŸãïŒ Vkontakteã«ãµã€ãæ©èœãšã¬ã³ãŒãã£ã³ã°ãã¹ããè¿œå ããããšã¯æ®ã£ãŠããŸãã
ãŸããæ©èœãç解ããŸãããã
ãªã³ã¯å±éã ãã€ãŒãã«ãªã³ã¯ãå«ãŸããŠããå ŽåãTwitterã¯JSONãè¿ããŸãããã®JSONã«ã¯ã
"urls"
ãå«ã
"urls"
èŠçŽ ããã
"urls"
ã 次ã®ããã«ãªããŸãã
"entities": { "hashtags":[], "user_mentions":[], "urls":[{ "indices":[0,21], "display_url":"dev.twitter.com/terms/display-\u2026", "url":"https://t.co/Ed4omjYs", "expanded_url":"https://dev.twitter.com/terms/display-guidelines" }] }
ãã€ãŒãã®ããã¹ãã«ã¯
"url"
ãå«ãŸããŠããããããªã³ã¯ãå±éããã«ã¯ãããã¹ãå ã®
"url"
å€ãå€
"expanded_url"
ã«çœ®ãæããã ãã§ãã
ç»åååŸã ãã€ãŒãã«åçãæ·»ä»ãããŠããå Žåã次ã®ããã«
"media"
èŠçŽ ã
"entities"
"media"
è¿œå ãããŸãã
"entities": { "hashtags":[], "user_mentions":[], "urls":[], "media":[{ "type":"photo", "media_url":"http://p.twimg.com/A7kqLpACEAAUlwz.png", "indices":[0,20], "sizes": { "large":{"resize":"fit","h":454,"w":584}, "small":{"resize":"fit","h":264,"w":340}, "thumb":{"resize":"crop","h":150,"w":150}, "medium":{"resize":"fit","h":454,"w":584} }, "display_url":"pic.twitter.com/XzDoEpH9", "media_url_https":"https://p.twimg.com/A7kqLpACEAAUlwz.png", "url":"http://t.co/XzDoEpH9", "expanded_url":"http://twitter.com/TestTwVK/status/268292032273977344/photo/1", "id":268292032278171648, "id_str":"268292032278171648" }] },
ç»åãžã®çŽæ¥ãªã³ã¯ã¯ãèŠçŽ
"media_url"
å«ãŸããŠããŸãã åçãããŒã«ã«ãã£ã¹ã¯ã®äžæãã¡ã€ã«ã«ä¿åããå¿ èŠããããŸããããtwitterãµãŒããŒããçŽæ¥VCã«ã¢ããããŒãããæ¹æ³ãèŠã€ãããŸããã§ããã
Twitterã§äœæ¥ããããã«åãåã£ãã³ãŒããèŠãŠã¿ãŸãããã
æåã«ãã°ã€ã³ããŠãã¹ããªãŒã ã®èªã¿åããéå§ããŸãã
url = "https://userstream.twitter.com/1.1/user.json" param = {"delimited":"length", "with":"user"} header = {} auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_key, access_secret) auth.apply_auth(url, "POST", header,param) logging.info('Twitter authorization successful') # req = urllib2.Request(url) req.add_header("Authorization", header["Authorization"]) r = urllib2.urlopen(req, urllib.urlencode(param), 90)
ãã€ãŒãã®å Žåã¯åçãèªã¿ãŸã-åŠçããŸã
while True: # length = "" while True: c = r.read(1) if c == "\n": break if c == "": raise Exception length += c length = length.strip() if not length.isdigit(): continue # tweet = json.loads(r.read(int(length))) # - if "user" in tweet and "text" in tweet and "created_at" in tweet and "id" in tweet: handleTweet(tweet)
ãã€ãŒãåŠçæ¹æ³ïŒ
# text = tweet["text"] #, , if not text.startswith('@') and not "@zzeneg" in text: # urls = tweet["entities"]["urls"] # for url in urls: text = text.replace(url["url"], url["expanded_url"]) # EyeEm - id # - if "media" in tweet["entities"]: photo = tweet["entities"]["media"][0] text = text.replace(photo["url"], "")
VKã䜿çšãã
VKã«ã¯ãããã«ç°ãªãèªèšŒã¡ã«ããºã ããããã¢ã¯ã»ã¹ããŒã¯ã³ã®ååŸã ãã倱æããŸãã
ãŸãããã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãäœæãããã®IDãååŸããå¿ èŠããããŸãã 次ã«ããã©ãŒã ã®ãªã³ã¯ã圢æããŸã
oauth.vk.com/authorize?client_id={ID}&scope=wall,photos,offline&redirect_uri=http://oauth.vk.com/blank.html&display=page&response_type=token
oauth.vk.com/authorize?client_id={ID}&scope=wall,photos,offline&redirect_uri=http://oauth.vk.com/blank.html&display=page&response_type=token
ã§ã{ID}ã¯ã¢ããªã±ãŒã·ã§ã³IDã§ãã ãã®ãªã³ã¯ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èš±å¯ã瀺ããŸã-å£ã«æçš¿ããããã®å£ãç»åãåããããã®åçãåä¿¡ããããŒã¯ã³ãæ°žé ã«ãªãããã«ãªãã©ã€ã³ã«ããã ãã®ãªã³ã¯ããã©ãŠã¶ã«ã³ããŒããŸãã VKã¯ããã®ã¢ããªã±ãŒã·ã§ã³ãžã®æš©éã®ä»äžã«ã€ããŠè³ªåããããŒã¯ã³ãå«ãURLã«ãªãã€ã¬ã¯ãããŸãã
ãã®ãããªã©ãããŒã¯ãVK APIã¡ãœãããæäœããããã«äœ¿çšãããŸãã ã³ãŒãã¯ç§ã®ãã®ã§ã¯ãããŸããããã©ãã§å ¥æããããå®å šã«å¿ããŠããŸããŸãããèè ã瀺ããªãã£ãããšããaã³ããŸãã
def vkMethod(method, data={}): url = 'https://api.vk.com/method/%s.json' % (method) data.update({'access_token': vkToken}) response = requests.post(url, data).json if 'error' in response: print 'VK API error: %s' % (response['error']['error_msg']) return response
ããã§ãvkTokenã¯VKã®åä¿¡ããŒã¯ã³ãmethodã¯VK APIã¡ãœããã®ãªã¹ãããã®ã¡ãœããã®ååãdataã¯ã¡ãœããã®äžéšã®ããŒã¿ã§ãã
å£ã®æçš¿ã«åçãæ·»ä»ããã«ã¯ããã®åçããŠãŒã¶ãŒã®ã¢ã«ãã ã«ã¢ããããŒãããå¿ èŠããããŸãã VKã®å£ã®åçã«ã¯ãç¹å¥ãªã¢ã«ãã ãšãããæäœããããã®ç¹å¥ãªæ¹æ³ããããŸãã æåã«åçãã¢ããããŒãããããã®ãªã³ã¯ãååŸããŠãããåçãä¿åããŸãã çµæã¯ãã®ã¡ãœããã§ãïŒ
def uploadPhoto(fileUrl): # url response = vkMethod('photos.getWallUploadServer') uploadUrl = response['response']['upload_url'] # urllib.urlretrieve(fileUrl,'temp.jpg') # files = {'photo': open('temp.jpg', 'rb')} response = requests.post(uploadUrl, files = files).json # response = vkMethod('photos.saveWallPhoto', response) # id return response['response'][0]['id']
ãã®ã¡ãœããã¯ãããŠã³ããŒãããç»åã®IDãè¿ããŸããããã¯ãå£ã«ã¡ãã»ãŒãžãäœæãããšãã«çŽæ¥æå®ã§ããŸãã
attachments = uploadPhoto(photo["media_url"]) vkMethod('wall.post', {'message': text,'attachments':attachments})
åæã«ã
attachments
ã空ã®è¡ã§ããå Žåãã¡ãã»ãŒãžã¯æ·»ä»ãã¡ã€ã«ãªãã§å£ã«è¡šç€ºãããŸãã
EyeEmã䜿çšãã
ç§ã¯EyeEmïŒããã¯Instagramã®é¡äŒŒç©ã§ãããéåžžã®ãã©ã€ãã·ãŒæ¡é ããããŸãïŒã䜿çšããŠãããæè¿ãããããVKontakteã«åçãã¢ããããŒãããã®ããããšæããŸããã 幞ããEyeEmã«ã¯éåžžã«ã·ã³ãã«ã§ç解ããããAPIããããã¹ã¯ãªããã®2è¡ã ãã§ãããããåçãããŠã³ããŒãããããã®ãµããŒããè¿œå ã§ããŸãã
IDã§åçãžã®ãªã³ã¯ãååŸããæ¹æ³
def getEyeEmPhotoUrlById(photoId): url = "https://www.eyeem.com/api/v2/photos/{0}?access_token={1}".format(photoId, eyeEmToken) response = requests.get(url).json return response['photo']['photoUrl']
ãã€ãŒãã§åçãžã®ãªã³ã¯ãèŠã€ãããã®URLãååŸããVKã«ã¢ããããŒãããŸã
if url["expanded_url"].startswith("http://www.eyeem.com/p/"): eyeEmId = url["expanded_url"].replace("http://www.eyeem.com/p/", "") photoUrl = getEyeEmPhotoUrlById(eyeEmId) attachments = uploadPhoto(photoUrl)
ã«ãŒã¿ãŒãžã®ã¹ã¯ãªããã®ã€ã³ã¹ããŒã«
å®æããã¹ã¯ãªããã¯githubããããŠã³ããŒãã§ããŸãã ãã¡ããããã®äžã®ããŒã¯ã³ã¯å€æŽãããŸã:)èªåã§ååŸããå¿ èŠããããŸãã
wikiã®æ瀺ã«åŸã£ãŠããµãŒãããŒãã£ã®ããã±ãŒãžããµããŒãããããã«ã«ãŒã¿ãŒãæ§æããŸãã Windowsã®ç°¡åãªèª¬æã次ã«ç€ºããŸãã
- NTFSã§ãã©ãã·ã¥ãã©ã€ãããã©ãŒããããããã®äžã«ã·ã¹ãã / binãã©ã«ããŒãäœæããŸã
- ãã©ãã·ã¥ãã©ã€ããã«ãŒã¿ãŒã«æ¿å ¥ãããšã¯ã¹ãããŒã©ãŒã§éãã ext_init.shãã¡ã€ã«ãããã«ã³ããŒããŸã
- ãã£ã¹ã¯ãåããŠã³ãããŸã-Webã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠããã£ã¹ã¯ãåãå€ãããã©ãã·ã¥ãã©ã€ããå·®ã蟌ã¿ãŸãã ãšã³ããªã
dropbear[4017] Running in background
ããã«ãŒã¿ãŒã®ãã°ã«è¡šç€ºãããã®ãåŸ ã£ãŠããŸã - SSHïŒroot / zyxelïŒãä»ããŠæ¥ç¶ããfinish_install.shãå®è¡ããŸãã ã¹ã¯ããã®äœæãåŸ ã£ãŠããŸãã
ã«ãŒã¿ã¯opkgããã±ãŒãžãã€ã³ã¹ããŒã«ããæºåãã§ããŠããŸãã ãããã®ãªã¹ãã¯ã Webãµã€ããŸãã¯
opkg list
ã³ãã³ãã§è¡šç€ºã§ããŸãã Pythonãšå¿ èŠãªã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããŸãã
次ã«ãã³ãã³ãã䜿çšããŠpythonãã€ã³ã¹ããŒã«ããŸãã
-
opkg install python
ããã³opkg install python-openssl
ã³ãã³ãã䜿çšããåºæ¬ããã±ãŒãž - ãã©ã«ããŒã
system\usr\lib\python2.7\
ã³ããŒããã ãã§ãã¢ãžã¥ãŒã«ãTweepyããã³èŠæ±ããŸãã æ°ããããŒãžã§ã³ã®ãªã¯ãšã¹ãã¯æ©èœããŸããã§ããã ãã£ãã·ã¥ãã©ã³ããŸãã¯ã¢ãŒã«ã€ãããè©ŠããŠãã ããã - cronãæå¹ã«ããã«ã¯ãã·ã¹ãã \ etc \ init.dãã©ã«ããŒã®K02cronãã¡ã€ã«ã®ååãS02cronã«å€æŽããŸã
- cronã§å®è¡ããããã«ã¹ã¯ãªãããæ§æããŸãã ã·ã¹ãã \ etc \ crontabs \ rootãã¡ã€ã«ã«ã次ã®è¡ãè¿œå ããŸã
*/15 * * * * killall -9 "python" ; /media/DISK_A1/system/usr/bin/python /media/DISK_A1/system/root/TwVk.py
@reboot
åèµ·ååŸã«åäœããcronã®æšæºã³ãã³ãã¯@reboot
ããŸããã§ããã ããã«ãã¹ã¯ãªãããå®ç§ã§ã¯ãããŸãããåèµ·åããŠã圌ãå·ã€ããããšã¯ãããŸããã 誰ããããè¯ãã¢ã€ãã¢ãææ¡ã§ãããªã-ãé¡ãããŸãã - æåŸã«ãã¹ã¯ãªãããsystem \ root \ã«ã³ããŒããŠããã£ã¹ã¯ãå床ããŠã³ãããŸãã
ãããã«
ãã®ã¹ã¯ãªããã¯ç§ã®ããã«çŽ6ãæéæ©èœããŠããïŒèšäºã¯éåžžã«é·ãæžãããŠããŸãïŒãã»ãšãã©ã®ãšã©ãŒãä¿®æ£ããŸããã VKã®ç§ã®å£ã¯ããªã³ã¯ãæ¡å€§ãããåçãæ·»ä»ãããŠãããããèªã¿ããããªããŸããã æºè¶³ããŠããŸãã ãã€ãã¿ãŒããããªã©ã®ã«ãŒã¿ãŒã«åºã¥ããŠãTwitterçšã®ã¹ã¯ãªãããããã«2ã€äœæããäºå®ã§ãã
ãã®èšäºã誰ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã å°ãªããšãããã®æå³ãããç®çã ãã§ãªããæ¢åã®ã«ãŒã¿ãŒã®äœ¿çšãéå§ããã«ã¯:)
ç§ã¯æ£çŽã«ãã¹ãŠã®ææ³ã®ééããšã¿ã€ããã¹ãä¿®æ£ããããšããŸããããäœãã«æ°ã¥ããã-å人çã«æžããŠãã ããã
ãŸããLinuxãšPythonã«ã€ããŠã®ç§ã®ç¥èã¯ãŒãããããã»ã©é ããªãããšãæ¹ããŠæãåºããŸããã¹ã¯ãªãããæ¹åããããã®ãã³ããåãã§ãèãããŸãã
è¬èŸ
- zyxmon ãç·ãš
èžæ°è¹ã®ãã©ãŒã©ã ã 圌ã®Zyxelã³ãã¥ããã£ãžã®è²¢ç®ã¯åŒ·èª¿ããããããšã¯ã§ããŸããã - ç§ã®ã¬ãŒã«ãã¬ã³ãã§ããkethlin_milã¯ã圌女ãããªããã°LinuxãcronãPerlãç解ã§ããªãã£ãã§ãããã