باز هم پایتون: اسکریپت GitGet برای جستجو و دانلود از GitHub
من بیشتر وقت آزادم رو با برنامه نویسی میگذرونم و مثل اکثر برنامهنویسها وقتی ایدهای به ذهنم میرسه اول توی گیتهاب دنبال اون میگردم. چند روز پیش این فکر به ذهنم رسید که یه اسکریپت برای جستجو توی گیتهاب بنویسم و نتیجهی کار رضایت بخش بود. الان از توی ترمینالم دنبال پروژههای گیتهاب میگردم و این برام خیلی راحت تر از کار کردن با مرورگره.
مراحل کار خیلی ساده بود چون سایت گیتهاب API فوقالعاده کارآمدی رو در اختیار برنامهنویسها قرار داده. اسکریپت رو با پایتون نوشتم و مراحل کار رو براتون مینویسم.
پایتون زبانیه که به سرعت میتونید یادش بگیرید و شروع به برنامهنویسی کنید. با تشکر از مستندات عالی پایتون نیازی به هیچ دوره یا کلاسی هم نیست.
خب بیاین شروع کنیم. اول از همه باید ببینیم چطور باید با سایت گیتهاب ارتباط برقرار کرد.
به Github Developer برید و روی API کلیک کنید. ما با بخش Search کار داریم که توی منو سمت راست میتونید ببینیدش. مثال اول صفحهی Search انقدر کامل هست که کار رو باهاش شروع کنیم.
https://api.github.com/search/repositories?q=tetris+language:assembly&sort=stars&order=desc
خط بالا رو توی بخش آدرس مرورگرتون کپی کنید تا نتیجه رو ببینید.
{
"total_count": 121,
"incomplete_results": false,
"items": [
{
"id": 21095601,
"name": "Tetris-Duel",
"full_name": "Tetris-Duel-Team/Tetris-Duel",
"owner": {
"login": "Tetris-Duel-Team",
"id": 7956696,
"avatar_url": "https://avatars.githubusercontent.com/u/7956696?v=2",
"gravatar_id": "",
"url": "https://api.github.com/users/Tetris-Duel-Team",
"html_url": "https://github.com/Tetris-Duel-Team",
"followers_url": "https://api.github.com/users/Tetris-Duel-Team/followers",
"following_url": "https://api.github.com/users/Tetris-Duel-Team/following{/other_user}",
"gists_url": "https://api.github.com/users/Tetris-Duel-Team/gists{/gist_id}",
"starred_url": "https://api.github.com/users/Tetris-Duel-Team/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/Tetris-Duel-Team/subscriptions",
"organizations_url": "https://api.github.com/users/Tetris-Duel-Team/orgs",
"repos_url": "https://api.github.com/users/Tetris-Duel-Team/repos",
"events_url": "https://api.github.com/users/Tetris-Duel-Team/events{/privacy}",
"received_events_url": "https://api.github.com/users/Tetris-Duel-Team/received_events",
"type": "Organization",
"site_admin": false
},
......
و اگه خواستید نتیجه رو توی ترمینال ببینید:
$ curl -i "https://api.github.com/search/repositories?q=tetris+language:assembly&sort=stars&order=desc"
میبینید که خروجی در قالب JSON بهتون تحویل داده میشه. اگه نمیدونید JSON چیه اینجا رو ببینید. خیلی سادست، باید جلوی =q اسم پروژه رو بنویسیم و جلوی language زبان مورد نظرمون رو.
خب حالا نوبت به پایتون میرسه که ورودی json رو پردازش کنه. اول از همه باید ورودیهای اسکریپت رو پردازش کنیم. برای مثال اگه نوشتیم:
$ gitget mediaplayer
اسکریپت توی گیتهاب دنبال اسم mediaplayer بگرده و اگه نوشتیم:
$ gitget browser cpp
اسکریپت توی گیتهاب دنبال پروژه هایی با اسم browser بگرده که با زبان ++C نوشته شدن.
این تکه کد این کار رو میکنه:
if len(sys.argv) < 2 or len(sys.argv) > 3:
usage()
sys.exit()
elif len(sys.argv) == 2:
request_link = "https://api.github.com/search/repositories?q=" + sys.argv[1] + "&sort=stars&order=desc"
elif len(sys.argv) == 3:
request_link = "https://api.github.com/search/repositories?q=" + sys.argv[1] +"+language:" + sys.argv[2] + "&sort=stars&order=desc"
قسمت اول برای ورودیهای نادرسته و قسمت دوم برای جستجو با نام و قسمت سوم برای جستجو با نام و زبان برنامهنویسی استفاده میشه.
خیلی خب دستورات بالا لینک رو ساختن حالا باید پردازشش کرد و قسمتهای مورد نیاز رو از توش کشید بیرون. برای این کار باید کتابخونهی json رو صدا بزنیم و ازش این طوری استفاده کنیم:
j = urllib2.urlopen(request_link)
js = json.load(j)
که مثلا برای برنامه ما این شکلی میشه:
j = urllib2.urlopen(request_link)
js = json.load(j)
for i in js['items']:
out_str = "Name: " + i['name'] + '\n'
out_str += "Language: " + i['language'] + '\n'
out_str += "Description: " + i['description'] + '\n'
out_str += "Size: " + str(i['size']) + ' kb\n'
out_str += "URL: " + i['html_url']
print out_str
این طوری قسمتهای name, language, description, size و url رو از توی ورودی json استخراج میکنیم و توی خروجی نشون میدیم.
دوباره خروجی فایل json رو ببینید. اول باید قسمت items استخراج بشه و بعد عناصر توی اون مثل name و ...
{
"total_count": 121,
"incomplete_results": false,
"items": [
{
"id": 21095601,
"name": "Tetris-Duel",
"full_name": "Tetris-Duel-Team/Tetris-Duel",
...
این قسمت کد هم همین کار رو میکنه:
for i in js['items']:
out_str = "Name: " + i['name'] + '\n'
اسکریپت کامل رو از اینجا بگیرید. بعدا قسمت دانلودش رو هم اضافه میکنم و توی یه پست دیگه میذارمش.
امیدوارم به دردتون بخوره.
این هم نمونهای از خروجی اسکریپت:
┌─[ali@aliHost] - [~/Other/eclipse-workspace/GitGet] - [2014-10-21 03:22:58]
└─[0] <git:(master f6b6b9✈) > gitget music_player python
Name: music-player
Language: Python
Description: Music player - endlessly plays your music
Size: 13068 kb
URL: https://github.com/albertz/music-player
=========================================================
Name: jukebox
Language: Python
Description: Democratic Jukebox - your democratic music player
Size: 465 kb
URL: https://github.com/lociii/jukebox
=========================================================
Name: python-mpd2
Language: Python
Description: Python library which provides a client interface for the Music Player Daemon.
Size: 593 kb
URL: https://github.com/Mic92/python-mpd2
=========================================================
Name: youtify
Language: Python
Description: Online music player
Size: 5930 kb
URL: https://github.com/youtify/youtify
=========================================================
Name: gmusicproxy
Language: Python
Description: Google Play Music Proxy - "Let's stream Google Play Music using any media-player"
Size: 598 kb
URL: https://github.com/diraimondo/gmusicproxy
=========================================================
Name: foobnix
Language: Python
Description: Foobnix Music Player for Linux (GPL v3)
Size: 34576 kb
URL: https://github.com/foobnix/foobnix
=========================================================
Name: sonata
Language: Python
Description: GTK 3 client for the Music Player Daemon
Size: 11701 kb
URL: https://github.com/multani/sonata
=========================================================
Name: UDJ-Server
Language: Python
Description: The Social Music Player!
Size: 13992 kb
URL: https://github.com/klnusbaum/UDJ-Server
=========================================================
Name: partify
Language: Python
Description: A collaborative music player based on Mopidy and inspired by turntable.fm
Size: 2086 kb
URL: https://github.com/fhats/partify
=========================================================
Name: dmusic-plugin-baidumusic
Language: Python
Description: BaiduMusic Plugin for Deepin Music Player
Size: 294 kb
URL: https://github.com/sumary/dmusic-plugin-baidumusic
=========================================================
Name: mpris-remote
Language: Python
Description: command line tool for interacting with music players that support the mpris spec
Size: 1483 kb
URL: https://github.com/mackstann/mpris-remote
=========================================================
Name: deepin-music
Language: Python
Description: deepin-music-player-private
Size: 59115 kb
URL: https://github.com/linuxdeepin/deepin-music
=========================================================
Name: exaile
Language: Python
Description: Cross-platform music player
Size: 71364 kb
URL: https://github.com/exaile-dev/exaile
=========================================================
Name: google-music-resolver
Language: Python
Description: Google Music Resolver for the Tomahawk music player
Size: 562 kb
URL: https://github.com/crabmanX/google-music-resolver
=========================================================
Name: albumbler
Language: Python
Description: A simple psychic playlist generator for a wide variety of music players.
Size: 119 kb
URL: https://github.com/keenerd/albumbler
=========================================================
Name: ccx2
Language: Python
Description: A console client for the xmms2 music player
Size: 511 kb
URL: https://github.com/palbo/ccx2
=========================================================
Name: minirok
Language: Python
Description: a small music player written in Python and inspired by Amarok
Size: 2140 kb
URL: https://github.com/dato/minirok
=========================================================
Name: gnome-music
Language: Python
Description: Music player and management application
Size: 12899 kb
URL: https://github.com/GNOME/gnome-music
=========================================================
Name: mpd-hiss
Language: Python
Description: Growl notifier for MPD (Music Player Daemon) written in Python
Size: 276 kb
URL: https://github.com/ahihi/mpd-hiss
=========================================================
Name: maried
Language: Python
Description: A public music player
Size: 687 kb
URL: https://github.com/marietje/maried
=========================================================
Name: mpd-myfm
Language: Python
Description: A client for Music Player Daemon that fills your playlist based on similar artists from Last.fm
Size: 664 kb
URL: https://github.com/xolox/mpd-myfm
=========================================================
Name: xchat-mpris2
Language: Python
Description: Xchat now playing plugin for MPRIS2-compatible music players. For MPRIS1 see duckinator/xchat-mpris.
Size: 134 kb
URL: https://github.com/duckinator/xchat-mpris2
=========================================================
Name: clementinemonitor
Language: Python
Description: Monitors what is currently playing in your Clementine music player, by hooking into the relevant dbus signals to detect state change.
Size: 168 kb
URL: https://github.com/evmcl/clementinemonitor
=========================================================
اینها را هم ببینید:
بسیار زیبا و هوشمندانه!
شما با Framework کیوت هم کار کردید؟ اگر آره، آیا برای یادگیری PyQt و Designer منبع خاصی سراغ دارید؟
فیلم - کتاب - مقاله و... زبانش اصلا مهم نیست. مهم اینه که تحت مجوزهای آزاد منتشر شده باشه.
ممنون میشم از راهنماییت.