ニコニコ生放送用コメントビューア「やります!アンコちゃん」 公式wikiです。

作成予定です。
プラグイン作成者向け

はじめに

アイデアと、アプリを作成するスキルはあるけど、プラグインとなると鳥肌が立つ方向けです。
といっても、難しいことはしていませんので、サンプルを改造することでアプリが作れないひとも作れるようになると思います。
サンプルとして、2.0.19で追加した診断メーカープラグインを教材にしたいと思います。

プラグインてどんなもの?


アンコちゃん内部での処理をプラグインで肩代わりして、独自の処理を施して、運営コメントを送ったりできるプログラムです。

とりあえずアイデアをリアライズしてみましょう

こういうことをしたいーというもやっとしたものを現実化してみます。

具体的にプラグインの仕組みに当てはめてみます。
  • リスナーからの指示で起動
  • コテハンを診断のときの名前にする
  • 結果を運営コメントで表示

具体的な部分に突入・診断メーカーとのインタフェース

webアプリケーションの診断メーカをアプリケーションに取り込む方法について説明します。

まずは手動で、サイトにアクセス

手動で動かして、どんなURLなのか調査します

これをプログラムに当てはめればもうできたも同然。

ではプログラミング

診断一覧を取得
1つ1つ試行錯誤して一緒に作ればいいのですが、時間の節約


診断
ごめんなさい、コメントのなさにびっくりしましたので、コメント付きと差し替えます

        private string ExecuteShindan(string namae, int index,int comno)
        {
            if (frm.shindanListBox.Items.Count<=index)
                return "";

            int sel = index;
            if (index == -1)
            {
                Random a = new Random((int)DateTime.Now.Ticks);
                sel = a.Next(0, frm.shindanListBox.Items.Count - 1);
            }

            _hash = Str2MD5("anko" + LibAnko.Utility.GetNowTime() + "anko");

            NameValueCollection val = new NameValueCollection();
            val["u"] = namae;
            val["from"] = "";

            //index -1でランダム
            shindanItem item = (shindanItem)frm.shindanListBox.Items[sel];

            HttpWebResponse webRes =null;
            StreamReader sr=null;
            try
            {
                   //ポストデータ
                string url  = "http://shindanmaker.com/" + item.Id;
                HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(url);
                webReq.CookieContainer = _cookie;
                webReq.Method = "POST";
                webReq.Referer = url;
                webReq.ContentType = "multipart/form-data; boundary=" + Boundary;
                webReq.UserAgent = "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
                webReq.Headers.Add("Cache-Control", "max-age=0");
                webReq.Headers.Add("Origin", "http://shindanmaker.com");

                webReq.Timeout = 10000;
                
                webReq.SendChunked = false;
                webReq.AllowWriteStreamBuffering = true;
                byte[] postDataBytes = System.Text.Encoding.UTF8.GetBytes(CreatePostData(val));

                webReq.ContentLength = postDataBytes.LongLength;

                Stream reqStream  = webReq.GetRequestStream();
                reqStream.Write(postDataBytes, 0, postDataBytes.Length);
                reqStream.Close();

                webRes =(HttpWebResponse ) webReq.GetResponse();
                sr = new StreamReader(webRes.GetResponseStream());
                string  res = sr.ReadToEnd();

                System.Text.RegularExpressions.Match castcheck = System.Text.RegularExpressions.Regex.Match(res, @"<div class=""result"">\s+<div style=""padding: 10px; font-size: 2em;"">([^<>]+)</div>", System.Text.RegularExpressions.RegexOptions.Singleline);
                if (castcheck.Success)
                {
                    string wk = castcheck.Groups[1].Value;
                    wk = wk.Replace("\r", "").Replace("\n", "").Trim();
                    string msg = frm.template.Text;
                    msg = msg.Replace("$no", comno.ToString());
                    msg = msg.Replace("$title", item.Title);
                    msg = msg.Replace("$result", wk);
                    return msg;    
                }

            }
            catch(WebException ex)
            {
               return ex.Message;
            }
            finally
            {
                if(sr!=null)
                    sr.Close();
                if (webRes!=null)
                    webRes.Close();
            }
            return "";
    


        }
        private string CreatePostData(NameValueCollection list)
        {
            StringBuilder data = new StringBuilder();
            data.Append("--" + Boundary + "\r\n");
            foreach (string str in list.AllKeys)
            {
                foreach (string item in list.GetValues(str))
                {
                    data.Append("Content-Disposition: form-data; name=\"" + str + "\"" + "\r\n\r\n");
                    data.Append(item + "\r\n");
                    data.Append("--" + Boundary);
                    data.Append("\r\n");

                }
            }
            return data.ToString();

        }
        private string Str2MD5(string str)
        {
            string hashBase = str;
            //文字列をbyte型配列に変換する 
            byte[] hashData = System.Text.Encoding.ASCII.GetBytes(hashBase);
            //MD5CryptoServiceProviderオブジェクトを作成 
            System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            //ハッシュ値を計算する 
            byte[] aryByte = md5.ComputeHash(hashData);
            return System.Convert.ToBase64String(aryByte);
        }

とりま、単体で動くことまで確認しましょう

単体で動けばあとは、簡単なのでそこまで仕上げます。

結果を運営コメントでおくってみます

ここまで来ればあとは体裁の問題です。

完成

binフォルダーにはファイルがたくさんあるけど、どれを配布すればいいの?
配布する場合のコンパイルオプションの注意点

コメントをかく


画像に記載されている文字を下のフォームに入力してください。

「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

×

この広告は60日間更新がないwikiに表示されております。

広告

Menu


外部ツール

はじめてのニコニコ生放送
その他の情報
【メニュー編集】

メンバーのみ編集できます

メンバー募集!
閉じる
XP向けのサポートは終了しています。
古いバージョンを続けてお使いになると、データの整合がとれなくなりバージョンアップできなくなる場合がありますので、なるべく最新をお使いください。