[DA series - Learn Python with Steem #12] Steem 小工具DIY #4 投票幫手

[DA series - Learn Python with Steem] 是DA(@deanliu & @antonsteemit)關於「從Python程式語言實做Steem區塊鏈的入門」的系列,歡迎趕緊入列學習!

前情提要:[DA series - Learn Python with Steem #11] Steem 小工具DIY #3 - 我的文章列表(二)

第#12堂課,嗨,繼續Python學習之旅,今天繼續「Steem 小工具」系列吧!

前言

最近好久沒有更新steem-python系列文了,真是對不起各位好學生啊(掩面)~到今天之前,我們所做的小工具都只有對於Steem區塊鏈的「觀察」,也就是像是讀取資料庫一樣。今天我們要稍微進階一點,來進行對區塊鏈的「寫入」,就從最基本的upvote著手吧!

在區塊鏈中,寫入也就意味著製造transaction,簽署交易,並且被區塊所驗證。在這過程中我們需要透過自己的private key來進行簽章,也就意味著我們必須在程式碼當中使用的我們的私鑰,所以大家要小心不要不小心暴露啦!

Keys on STEEM

在這之前我們要先對steem的私鑰管理系統有多一點的理解。在Steem的設計中,把一個用戶的權限一共分在了三把私鑰上,每個人可以依據使用情境不同決定只用某一把私鑰登入,以保障帳號安全。這三把私鑰分別為:

  1. Posting Key:授權貼文、投票、轉貼、回覆等等基本操作
  2. Active Key:授權與資產相關的轉帳、Powerup等等
  3. Memo Key:授權讀取加密的轉帳memo

當然,還有一把Master Key作為掌管一切的主密碼。不過在我們接下來要實作的例子中,由於只是要進行投票,所以只會用到posting key的權限,也建議大家在執行程式時只要導入自己的posting key就好,免得意外發生造成損失。

取得Posting Key的方法:

  1. 進入Steemit Wallet頁面
  2. 點選Permission頁籤
  3. 點選Posting Key旁的show private key按鈕顯示私鑰,並存下來等著待會用。

Upvote 小工具

今天我們來寫一個可以upvote特定使用者最新文章的腳本。其實Steem-python函式庫已經把整個簽章投票過程變得超級無敵簡單,我們只要在一開始呼叫Steem類別時「代入我們的Posting Key」,並且找到我們目標upvote文章的identifier,剩下的事情就可以交給Steem-python函式庫去處理。

如同我們剛剛說到的,在程式碼中寫死自己的posting key雖然比較方便,但也比較容易不小心暴露出去,所以在這裡也建議大家使用如同之前的argv[]的寫法來讀取執行時寫入的私鑰。這裡一共設計了四個參數要在執行腳本時傳入,分別是target_user,account_username,account_posting_key以及upvote_weight。因此腳本執行時輸入如下:

1
python upvote_username.py eosasia antonsteemit 5JMYPOSTINGKEY000000BLAHBLAHBLAH 50

代表我們想要使用帳號@antonsteemit,給@eosasia最新的文章投票,voting_weight 為 50%。因此在此一腳本中,分別將這些傳入的三數存入四個變數中如下:(此篇教學的程式碼可以參考upvote_username.py

1
2
3
4
5
6
7
8
9
10
11
from steem import Steem
import sys

def upvote(account_name ,post, weight):

target_username = sys.argv[1]
account_name = sys.argv[2]
account_postkey = sys.argv[3]
vote_weight = sys.argv[4]

s = Steem("https://api.steemit.com", keys=[account_postkey])

其中最後一行,宣告Steem 類別時,我們要將posting key放入 keys=[]這個參數中傳入,來建立這個可以動用我們posting key的類別。到這裡,其實稍有不同的部分就做完了,後面我們只要透過類似之前尋找發文紀錄的機器人的做法,找到target_username最新的文章,接著就可以利用內建的mothod: Steem.commit.vote()來投票了。

我們可以直接看主要程式部分的程式碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
target_post = {}
history = s.get_account_history(target_username, index_from=-1, limit=1000)
for operation in reversed(history):
op = operation[1]['op']
if op[0] == 'comment':
if op[1]['parent_author'] == '':
_permlink = op[1]['permlink']

# Check if the Post has already been upvoted by my account
if account_name in [v["voter"] for v in s.get_active_votes(target_username, _permlink)]:
print("Already voted on this. Skipping... {}".format(op[1]['title']))
continue

# Save target vote in a dictionary structure
target_post["permlink"] = _permlink
target_post["title"] = op[1]['title']
target_post["identifier"] = '@{}/{}'.format(target_username, target_post["permlink"])
print('Target Post: {}'.format(target_post["identifier"]))
upvote(account_name, target_post, 5)
break

重複投票檢驗

前半段迴圈的架構跟之前的程式是相同的,可以直接複製過來使用。其中略微不同的點在於,每當我們找到該做找最新文章,我們要先確認我們有沒有upvote過這篇文章。檢驗的方法是透過s.get_active_votes(author, permlink)這個呼叫來看看,他會回傳一個list of dictionary,我們只要檢查每個dictionary中的 ["voter"] 都不是我們的帳號,就可以確定沒有投過此文章,確保投票會成功。

Identifier

再來是關於目標文章,我們使用target_post這樣一個字典來儲存,然後再一起丟到upvote()這個函式裡。其中存了一個叫做的target_post["identifier"]的變數,他就是一個形式為"@username/permlink"字串。為這麼做是因為在steem-python投票的這個method當中,就是要我們輸入這樣格式的identifier來辨認這篇文章。

最後來介紹這個簡單自製的upvote function。其實大家也沒有必要一定要單獨寫一個函式,因為在裡面做的事情也只是去呼叫steem.commit.vote()罷了。

1
2
3
4
5
6
def upvote(account_name ,post, weight):
try:
s.commit.vote(post["identifier"], weight, account=account_name)
print("Casted vote({}%) on: {}.".format(weight,post["identifier"]))
except Exception as error:
print("Error : {}".format(error))

可以看到這個小函式中,只是把s.commit.vote()包在一個try - except的架構裡。這樣可以防範如果投票失敗,並不會終止程式,而只會印出錯誤代碼。這種try - except的語法被稱作Error Handler,在編寫比較大,或是需要長期運作的程式時可以透過它來避免小bug直接造成程式停止。就這麼簡單!我們的小小跟班程式就完成啦!以後可以透過這個程式每天upvote自己的好朋友囉~

更多功能

為了防止有人覺得太簡單沒有挑戰性,大家可以回去練習實作自己的「篩選機制」。例如:還記得get_account()可以用來獲取帳戶訊息嗎?可以設計成只有在自己voting_power大於某個值時才進行投票,或是依照其他因素選擇upvote_weight。就讓大家自己發揮創意囉~

class-377117_1280.jpg
image - pixabay


This page is synchronized from the post: ‘[DA series - Learn Python with Steem #12] Steem 小工具DIY #4 投票幫手’

[慵懶假日] 早伴早餐之早午餐

DSC_6273.JPG

上週末回老家前,已經跟好友約好,我們一早下去,跟他去台中市區的綠園道附近吃個早午餐再走。於是我們一早就出門,到達台中這間餐廳,都還不到十點鐘呢!

朋友挑的這一家餐廳,早伴早餐,他說是很有名的新興IG打卡地點。我看外面挺陽春的,不過,也可以說是很有日式風格囉!

放著這麼大的院子不用,有個性~~

DSC_6275.JPG

這台腳踏車看起來應該是裝飾的一部份~~

DSC_6276.JPG

DSC_6277.JPG

很美吧!那天陽光很好~~

DSC_6279.JPG

簡單復古風~~

DSC_6280.JPG

店內座位其實不多,高朋滿座了~~

DSC_6281.JPG

窗外還能見到旁邊的民宅~~~

DSC_6284.JPG

DSC_6288.JPG

半自助服務~~

DSC_6290.JPG

房子是老房子改裝的,應該是日本時代的房子,也不算真的太老。

DSC_6289.JPG

看看菜單吧!加套餐的話,價格高一點,單點其實都還算不貴的。以餐廳來說,我覺得不貴。

DSC_6282.JPG

DSC_6283.JPG

冷萃咖啡與黑糖牛奶~~ 好喝耶~~~

DSC_6291.JPG

哈哈,吐司已經被我兒咬一口了~~ 蠻精緻的口感~~

DSC_6292.JPG

炒蛋~~

DSC_6293.JPG

我吃的是莎莎德式香腸堡,超好吃的,莎莎醬做得很棒,新鮮清爽酸辣,配上德國香腸,哇~~~~讚!

DSC_6296.JPG

老婆吃嫩蛋火腿堡~~也不錯。

DSC_6295.JPG

吃得開心,聊得開心~~ 整體而言,是一間相當有水準的餐廳,價格也平易近人。下次會想再來喔!~~

DSC_6274.JPG


This page is synchronized from the post: ‘[慵懶假日] 早伴早餐之早午餐’

[懷舊小吃] 士林:朱家雞肉飯・北港肉焿

兩個月前,深夜放過一次士林美食毒,分享了兩間士林老字號。話說,這兩個月來,做夢都夢到各家士林老字號到我夢裡來嗆我:我們家也很老字號啊,不比別家差,你也吃過了,照片都拍了,怎麼還不快點放上區塊鏈哪!

這讓我睡不好,所以,今天我就把另外兩家吃過的士林懷舊老字號美食給整理出來吧!大家看過後,大概就知道士林這一類的古早口味料理小吃店是挺多的呦~~

為您上菜:朱家雞肉飯,與…. 北港肉焿!


朱家雞肉飯

雞肉飯、筍絲控肉飯、湯意麵、小菜們、酸菜豬肚湯…. 看看誰能跟我比!?

DSC_5930.JPG

DSC_5932.JPG

DSC_5931.JPG

DSC_5933.JPG

DSC_5934.JPG

DSC_5935.JPG

DSC_5938.JPG

DSC_5936.JPG

DSC_5937.JPG

DSC_5929.JPG


北港肉焿

雞肉飯(對,也有)、肉焿、乾意麵、白菜魯、虱目魚肚…. 拼場啦!

photo6089009628877793338.jpg

DSC_6151.JPG

DSC_6156.JPG

DSC_6154.JPG

DSC_6152.JPG

DSC_6150.JPG

DSC_6155.JPG

排完毒後,身體清爽多了~~ 哎呀,肚子餓了,來去找找美食吃吧!^0^


This page is synchronized from the post: ‘[懷舊小吃] 士林:朱家雞肉飯・北港肉焿’

[創作] 大鵬去哪兒了?

sky-1525902_1280.jpg

大鵬去哪兒了?是的,大鵬, @dapeng,去了哪兒了,怎麼消失這麼久?

最後一次發帖是20天前,最後一次發言,也是一樣久了。那一天,他也把50 SBD換成了Steem,然後消失於江湖。帳戶裡,還有1000 SBD存著,325 SBD隨時可動支,230 Steem也還在… 不像是被盜帳號了。

錢包還在接收著銀行利息進帳,似乎是自動點讚的機器人還在運作著….

1459個粉絲,殷殷期盼著,看著5926篇鳥羽鵬跡,不知何時得見鳳翎?

難道 …. 難道 …..

事了拂衣去,深藏身与名。

螢幕快照 2018-09-04 下午7.37.41.png

不會吧?不會吧!該不會是『事』已了,於是『拂衣去』?

估值不到7000刀美元的帳戶價值,不像是可以退隱求去的本錢。還是中了彩票,誰去查查德國最近有無開出大獎?發家了也不能就這麼明顯地消失啊!中大獎SOP明明寫道,剛中獎一定要維持原本生活型態,然後慢慢fade out,慢慢想個大家可以認同的,讓你消失的理由,例如換工作、移民…. 否則,綁匪跟壞朋友就會很快發現你發家了的!

難道 …. 難道 ….. 他去開發英語大屁屁了?對啊!帳號不就是dapp-eng?北方冷氣團南下….

難道 …. 難道 ….. 最後一帖,烏托邦給讚到了$32,他突然感覺一篇$2-$3實在太累人了,於是暫且休息去?

難道 …. 難道 ….. 拍了公交车上的小女孩之後,他不小心,不小心~~~ >_<~~~ 喂!後來還有發帖啦~~~

難道 …. 難道 ….. 因為他寫了刘美女的代理,劉美女卻沒在理,他太傷心了?

是了,很有可能,很有可能。你看看那張圖,多麽失意?或許就是由於我沒理他,於是他到處去拍照散心,拍了雲,拍了小女孩 geh aus, arschloch!!,最後寄失望於烏托邦工作後,還是難以排解,於是“深藏身与名”?

哎,這是何苦呢?

你明明知道,mention這功能挺廢的,劉美女也是成天刷文不看文的,何必跟她一般見識?

而且她其實已經逼近三十了(不是宣稱的25歲了),所以有點老人痴呆,也是剛剛才發現有這一篇:

临时海豚诞生记,唱首卡农献给你 Canon in Chinese Songs

真是嚇出一身冷汗啊,都已經是八個月前的文章,她剛剛才看到。後知後覺之延遲程度,比恐龍有過之而無不及啊!

還是… 還是?

如今代理收回,以后,我可以为所欲为,再无负担,哇哈哈。

大鵬去幹壞事去了?

嗯,對對對!一定是的。拒絕相信自己跟這件失蹤案有關係 一定是很重要很重要的壞事,一定是要耗去大量時間的壞事,那,我們就在這裡祝福大鵬趕緊做完壞事,做好壞事,然後趕緊回來團聚啊~~

不用擔心,我們都不會Judge你的,無論你做了什麼壞事,別對我們做壞事就行了….

…..

大鵬大鵬,註定就是要展翅離開,鵬飛萬里…. 是嗎?就不能留下一聲輕輕的道別,然後再絕塵而去嗎?

你呢?你認為,大鵬去哪兒了呢?

magnifying-glass-1607208_1280.jpg

images - pixabay


This page is synchronized from the post: ‘[創作] 大鵬去哪兒了?’

[礁溪二三事] 奕順軒・切達乳酪狀元餅

DSC_6245.JPG

呵呵,你以為[礁溪二三事]系列悄悄結束了嗎?其實還有最後一篇!對啦!今日就要告訴你,我認為礁溪的超值伴手禮名店….

奕順軒!!這家糕餅店,在地深耕….. 誒…… 幾十年?反正很久就對了啦!而且,不像是很多台灣的特產店家,紅了之後就全台開店去,這一家堅持只此一家,別無分號。沒來礁溪,就買不到喔!(代購或是偶而似乎百貨公司會有代售一些的樣子)

如我之前說的,我們沒做功課。經過這間店時,只覺得,蛤!是有這麼好吃嗎?人山人海的(這次照片拍的時間較早所以人比較少一點)… 後來進去看看,還試吃了一些之後,心中暗自決定要走的時候要來買回台北,當做伴手禮送人!因為,真的不錯吃(Again,來自一個不喜歡吃甜點的我的評論),而且,價格算很超值的喔!

DSC_6235.JPG

還有賣麵包,就知道他們不是只賣傻傻的觀光客,在地人都來光顧的。

DSC_6237.JPG

門口有兩大壺冰麥茶,超好喝的!我一小杯一小杯的喝喝很飽,哈哈!很淡的麥香,比一般麥茶更細緻的味道,還是其實是因為免費,所以我覺得很好喝?哇哈哈~~看看旁邊專門回收小紙杯的器具,就知道每天人流有多少了….

DSC_6236.JPG

茶壺旁有一小攤試吃蛋糕類(奶凍捲們),給試吃品很大方,我還覺得太多,因為我要去吃當地小吃,沒肚子吃太多啦!呵呵~~ 我們也有買一捲回去。

DSC_6240.JPG

切達乳酪狀元餅!據說是店內最紅商品,二話不說扛四盒走~~ 我有試吃過,所以很滿意。

DSC_6238.JPG

品項算是蠻多的。

DSC_6243.JPG

這是價目表。

DSC_6244.JPG

還可以宅配喔,不怕帶不走!^^

DSC_6239.JPG

DSC_6241.JPG

DSC_6242.JPG

切達乳酪狀元餅,已經帶回台北家裡囉~~

DSC_6259.JPG

開盒見見要吃你的人吧!嘻嘻~~~

DSC_6260.JPG

裡面也給開封了~~~ 一個字,圓~~~

DSC_6338.JPG

切一塊給您瞧瞧橫切面~~~咬一口,一點點鹹,一點點甜,起司味道,餅皮香味~~ 嗯~~~ 我是狀元啊~~~

DSC_6339.JPG

來一杯咖啡配著吃,或是一杯熱茶也可以。邊吃邊回憶礁溪好玩的種種~~~

DSC_6340.JPG

[礁溪二三事],至此全部播畢,感謝您的收看!祝您下一次到礁溪玩耍,能夠按圖索驥盡興囉~~~


This page is synchronized from the post: ‘[礁溪二三事] 奕順軒・切達乳酪狀元餅’

真人指數,誰是誰,新手村?

九個月前,不才我的Steem十講,開宗明義第一篇就談Steem區塊鏈運行的基礎:人。

[ Steem十講之第一講 ] 行為的主體

這一篇就是談在匿名性這麼高(真人與帳戶之間難以確認連結),馬甲可以無限多的,區塊鏈世界,要發展Attention Economy,那就得要進一步確認『真人指數』,才能有良好的發展。

Byteball的空投是個好例子,他們是利用Rep這項數字來做一個初步過濾,但大家都知道,這數字並不是太好的指標,儘管確實有一定的效果。想想看,很多新項目都願意免費空投給許多“真人用戶”,但最害怕的事情就是,發了一百份,結果都是同一個人的,廣告推廣效果頓時降低一百倍!

因此,咱老大Ned在發展SMT同時,也想到了這問題,所以有這一篇他與技術老大的對談,裡面的Oracle概念,就是一種提供某種“真人指數”的機制。

我其實很久以前就一直覺得很遺憾,Steem沒有發展出相關的東西來,會限制了相關發展,所以看到上面那一篇,很開心他們終於重視這問題了。

更開心的是,前一陣子,竟然有個Project上門來點我讚還留言,我才注意到這個項目。這陣子已經算蠻紅了,甚至CN區都不少小夥伴都代理給他們了。我自己也試代理了一些。對!就是Steem-UA項目,帳戶是 @steem-ua。我是沒去算代理可以拿多少好處,但重點是….

這項目就完全是上面我談的概念的落實啊!如果當初我去找人好好來發展這概念,現在是不是我可以拿到這麼多代理呀~~❤️ 所以,很開心,尤其是,這是社區自發的行動;尤其是,他們可能可以賺到錢,還有利於社區長遠發展;尤其是,這樣的項目如果成功,對於其他開發者的激勵效果將會很強!….

Steem-UA項目似乎是運用某種AI或是計算方式,來計算我所謂的“真人指數“。每個人都有個分數。當這套系統更多人用之後,你的分數,就會決定你的某些待遇,反過來,會讓Steem-UA團隊影響力大增,因為他們決定了你之為你,在某些方面有多高價值!這聽起來似乎有點中心化是嗎?But so what?這是自由市場長出來的自願性中心化,每個人都可以去競爭這樣的Oracle Power,不是嗎?

其實,Oracle就是可以競爭的。一方面當然是有利可圖,另一方面,這是自由開放的,且未來很可能對於這方面的需求也是多元的。例如,有的項目想找對科技有興趣的群眾,有的項目想找特定語言族群,有的項目想找具有父母角色的群體…. 而不同的Orcale,可以對於特殊族群有更好的鑑別力,因此更能夠滿足某類客戶需求… 所以,市場上可以有很多類型的Orcale存在的

於是,這讓我想到,如果有人要CN區的Oracle,目前有嗎?應該不算有。但真要找的話,其一方法是把CN區名單(例如 @chinadaily維護的)跟Steem-UA合作過濾,但這方法可能會有不少缺失的。其二,有待發展的,或者說,我認為有潛力來做這件事的,就是CN區的新手村 @team-cn了。

想想看,長遠來看,未來假設大部分會用中文的人,透會經過新手村階段(不經過的可能就是要等久一點才被認證),那麼新人們很快可以在村內取得自己的社交地位,進而建立自己的“真人地位”。透過微信群也好,新手村作業或訪談也好,其實都可以當成是一種“真人指數”的累積。

這樣的“真人指數”資料庫,其實是很有價值的。想一想,在HF20後,如果CN區人數爆增,到一萬人就好了。一群可以大致確認為真人(因此大致能夠排除馬甲與不活躍用戶),且擁有區塊鏈基本知識(不知道就在Steem上學學)的中文使用群眾資料,具有多高的市場價值?光是想想一年後各種各樣SMT想行銷就夠了….

趁著人數還不多時,趕緊思考怎麼建立這樣的資料庫,才能迎接日後的成功啊!(淚~~)

當然,有志者都可以來競爭,例如Partiko這個厲害的移動端UI,也有不錯的優勢喔~~ 或是Steem-UA分數很高的大銀行行長,也有存款戶資料啊~~ XD

我那一篇[ Steem十講之第一講 ] 行為的主體裡也有些ideas,歡迎採納啊~~

images - pixabay


This page is synchronized from the post: ‘真人指數,誰是誰,新手村?’

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×