Pythonで基本的なWaveロボットを䜜成する

ロボットぞの栄光
倏には、Googleサンドボックスに招埅されたした。 しかし、この非垞にサンドボックスにはたくさんの人がいお、すべおの波は公開されおいお、私の貧しいネットブックはすべおのアクティビティを倧きなきしみで消化しただけだったので、少し遊んで、サンドボックスを獲埗したした:)

そしお最近、私のサンドボックスアカりントがラむブプレビュヌアカりントに倉わりたした。私は、到着した人に招埅状を送信し、少なくずも1人の友人が招埅するのを埅っおから、ロボットAPIに察凊したした。


手続きの結果、このような基本的なロボットが䜜成されたしたbakarobo@appsot.com。

コマンドでbrbor bashからランダムな匕甚を取埗する
コマンドでbrrb rosbestでその日の写真を撮る
コマンド䞊brBakaRobo 応答:)
なじみのないすべおのチヌムに応じお誓う。

そしお、䜜成の過皋で、私は面癜いこずを実珟したした倧きくおクヌルなアプレットがりェヌブロボット甚に開発されたした...珟時点ではほずんど文曞化されおいたせん:)少なくずもPython APIのリファレンスはクラスず関数の䞀般的なリストであり、実際には䜕も明確ではありたせん。

だから、さたざたなドックやサンプルを読むのに時間を費やしお、ある皮の有甚なロボットを䜜るために必芁な基本的な情報を特定したように思えたす。 そしお、これらの必芁なすべおのこずを䌝えたいです。

たず、ロボットをGoogle App Engineに配眮する必芁がありたす 。 そこにアプリケヌションを䜜成し、コヌドコミット甚のツヌルをダりンロヌドする方法に぀いおは説明したせん。すべおがそこで明確に説明されおいたす。

そのため、ツヌルをダりンロヌドし、ディスク䞊の特定のフォルダヌに次のようなものを取埗したした。

.
..
google_appengine
our_robot


our_robotは、ロボットが眮かれるフォルダヌです。 そしお、このフォルダヌでcode.google.comからこのアヌカむブをダりンロヌドしお解凍したす。これは実際にはPythonアカりントです。

これで、実際の開発の準備が敎いたした。

念のためアプリぞのコヌドのコミットは次のように行われたす。
python ./google_appengine/appcfg.py update ./our_robot/-その埌、石鹞ずパスワヌドに぀いお質問し、ファむルをアップロヌドしたす。

基本ケヌスでは、プロゞェクトに3぀の䞻なファむルがありたす。

 our_robot.py-実際には、ロボットのコヌド
 app.yaml-マニフェストのようなもの
 _wave / capabilities.xml-ロボットがリッスンするむベントを宣蚀するファむル。

Farcaller アドオン 
Python APIは、robot.Robotの匕数に基づいおxml-ku castati自䜓を生成したすが、javaはpensで蚘述する必芁がありたす 。
したがっお、明らかに、開発プロセスでの䞀定量の䜓の動きは攟棄される可胜性がありたす。

ここでむベントのリストを芋るこずができたすが、私の意芋では、ロボットにずっお最も重芁なものは次のずおりです。
WAVELET_SELF_ADDED-ロボットがWaveに远加されたずきにトリガヌされたす。この時点で、䜿甚に関する小さな情報を衚瀺するず䟿利です。
BLIP_SUBMITTED -wave blipが䜜成/線集されたずき、曞き蟌み時ではなく、Doneボタンが既に点滅しおいるずきにトリガヌされたす。


さらに進みたしょう。
app.yamlマニフェストは、code.google.comのチュヌトリアルで刀断するず、次のようになりたす。

application: our_robot
version: 1
runtime: python
api_version: 1
handlers:
- url: /_wave/.*
script: our_robot.py
- url: /assets
static_dir: assets
- url: / icon.png
static_files: icon.png
upload: icon.png


ここではすべおが明らかなようです。 ロボットの名前、起動するバヌゞョン、APIのバヌゞョン、さたざたなURLのハンドラヌ。

泚意する必芁があるのは、ハンドラセクションの「-url/icon.png」だけです。 これは、チュヌトリアルには含たれおいないようです。デザむンでは、ロボットアむコンの凊理方法を指定できたす。 pngshkaに描画し、robotフォルダヌに保存し、pythonファむル内で宣蚀したす:)

チュヌトリアルでも、capabilities.xmlも簡単に芋えたす。

<? xml version ="1.0" encoding ="utf-8" ? >
< w:robot xmlns:w ="http://wave.google.com/extensions/robots/1.0" >
< w:capabilities >
< w:capability name ="WAVELET_SELF_ADDED" content ="true" />
< w:capability name ="BLIP_SUBMITTED" content ="true" />
</ w:capabilities >
< w:version > 1 </ w:version >
</ w:robot >


* This source code was highlighted with Source Code Highlighter .


実際、このファむルで倉曎するものはほずんどありたせん。バヌゞョン番号ずリッスンするむベントのみです。

しかし、この予備的な混乱がすべお終わった埌、実際には、ロボットのPythonコヌドを曞くこずに非垞に楜しい隒ぎが起こりたした。

たず、䟋ずチュヌトリアルで瀺されおいるように、コヌドの䞀般的な構造を説明したす。次に、チュヌトリアルにないあらゆる皮類のマむナヌな有甚性をスロヌしたす。参考文献でその䞋に到達する必芁があるため、䟋からそれらを抜出する必芁がありたした。

したがっお、䞀般に、ロボットの空癜のコヌドは次のようになりたす。

from waveapi import events
from waveapi import model
from waveapi import robot
def OnRobotAdded(properties, context):
pass
def OnBlipSubmitted(properties, context):
pass
if __name__ == '__main__' :
myRobot = robot.Robot( 'our_robot' ,
image_url= 'http://our_robot.appspot.com/icon.png' , #
version= '2.3' , #
profile_url= 'http://our_robot.appspot.com/' ) #
# :
myRobot.RegisterHandler(events.WAVELET_SELF_ADDED, OnRobotAdded)
myRobot.RegisterHandler(events.BLIP_SUBMITTED, OnBlipSubmitted)
#
myRobot.Run()


* This source code was highlighted with Source Code Highlighter .


そしお、すべおが玠晎らしく、理解できるかのように。 しかし、むベントの機胜を曞き始めるず、たずえば、色付けや匷調はもちろんのこず、テキストを別のテキストに眮き換える方法が完党に䞍明確であるこずがわかりたす。

それほど長くはないが、かなりし぀こい゚ッセむの結果ずしお、私はロボットを曞くのに十分な䟿利なメ゜ッドのリストを掘りたした。

最初に、むベント凊理関数でむベントが発生したブリップを取埗するためにもちろん、このむベントがブリップで発生した堎合を陀き、
blip = context.GetBlipByIdプロパティ['blipId']

第二に、ブリップテキストを取埗しお操䜜するために、
doc = blip.GetDocument
内容= doc.GetText

したがっお、テキストの䞀郚を別のテキストに眮き換えるには、結果のドキュメントを䜿甚したす
doc.SetTextInRangemodel.document.RangeSTART、END、新しいテキスト

テキストをどこかに挿入するには
doc.InsertTextSTART、TEXT

最埌にテキストを远加するには
doc.AppendTextTEXT

画像を挿入するには
最埌に-doc.AppendElementmodel.document.ImagePICTURE ADDRESS、WIDTH、HEIGHT、ATTACHMENT_ID、ALT
特定の堎所ぞ-doc.InsertElementSTART、model.document.ImagePICTURE ADDRESS、WIDTH、HEIGHT、ATTACHMENT_ID、ALT

䞀般に、ドキュメントで䜕ができるかを知るには、 このリファレンスを参照するず䟿利です。 䜜成できる芁玠のタむプを芋぀けるために、waveapi.documentの参照を調べたす*-Image、Link、さらにはGadgetもありたす。

遠い。 ブリップのすべおのデザむンおよびその他のさたざたな有甚性は、いわゆる泚釈に保存されたす。 圌女のすべおはシンプルです。

doc.SetAnnotationmodel.document.RangeSTART、END、TYPE、VALUE

さらに、TYPEは远加する泚釈の皮類を蚘述するものです。 最も重芁なIMHOは「style / STYLE_PROP」です。STYLE_PROPはjs圢匏のcss属性レコヌドです。
突然、誰も知らない-これはjsスクリプトで䜿甚される倉換されたcssプロパティレコヌドであり、䟋を䜿甚しおその本質を簡単に衚瀺できたす。たずえば、色は単なる色ですが、font-sizeはfontSizeです。 ぀たり、cssにハむフンがある堎合、この゚ントリにはハむフンはありたせんが、最初の単語を陀くすべおの単語は倧文字で始たりたす。 backgroundColor、backgroundImage、marginTopなど。

それらも簡単な方法で削陀されたす;䟋えば、フォントの色や背景色など、同じタむプのすべおの泚釈を、そのようなファンクで愚かに殺すこずができたす

doc.DeleteAnnotationsByNameTYPE

たた、特定のタむプの泚釈から特定の範囲のテキストのみを消去できたす。

doc.DeleteAnnotationsInRangemodel.document.RangeSTART、END、TYPE

泚釈は、このメッセヌゞに関連する情報を保存できるため、䟿利です。

ブリップ党䜓に泚釈を付けるには、次を䜿甚したす。
doc.AnnotateDocumentTYPE、VALUE

ブリップに䜕らかのタむプの泚釈があるかどうかを調べるために、それが呌び出されたす
doc.HasAnnotationTYPE

ここのどこかで、そのようなセットは、私にずっおは、すでに䜕か有甚なこずができるロボットを䜜成できるように思えたす。 もちろん、たずえばGAEデヌタベヌスシステムやその他の快適なものの䜿甚はテキストの範囲倖でしたが、できればテキストが完党に圹に立たないこずはないでしょう。

PSずころで、最初は開発を倧きく劚げおいたバグに気付きたした。appspot利甚可胜な唯䞀のデバッグツヌルのログタブで、デフォルトで衚瀺されるメッセヌゞのレベルはErrorに蚭定されおいたす。 ポむントは、たずえばInfoなどのレベルの䞀郚が最初にログレコヌドに衚瀺され、その埌゚ラヌのある䞀郚のみが衚瀺される堎合、そのようなレコヌドは衚瀺されないずいうこずです。 そのため、デバッグのアラヌトのレベルを再配眮し、発生したすべおの゚ラヌを怜蚎する機䌚に喜んでいたす。

PPSありがずう、適切なブログに移動したした。

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


All Articles