ハブ君の寝言

日記のような何か

twitterに発言するっぽいperl

    • -

update.10.11.19
PerlをOAuth対応版に修正
OAuth認証については
http://d.hatena.ne.jp/hab_kun/20101026/1288085670
を参考にしてみるとなんとかなるよなならないような

    • -

引数を発言するプログラムを書いた

CreateProcess(_T("perl"),_T("perl test.pl haro-wa-rudo"),NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo);

とかやると、発言してくれる。
C++twitterの発言をさせようと頑張ったけど無理だったorz
なので、C++で頑張ってBOTを書いても大丈夫なように、perlに引数を渡してやれば…とか妄想したら書けた。俺頑張った。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Net::Twitter;
use utf8;  	# 文字列をutf8として扱う
use Encode; 	# 文字コード変換 encode()/decode()ライブラリ

@ARGV = map { decode('cp932',$_) } @ARGV ; 
my $consumer_key = 'xxxxxx';
my $consumer_key_secret ='xxxxxx'; 
my $access_token = 'xxxxxxxx';
my $access_token_secret = 'xxxxxxxxxxxxxx';
 
my $nt = Net::Twitter->new(
  traits          => ['API::REST', 'OAuth'],
  consumer_key    => $consumer_key,
  consumer_secret => $consumer_key_secret,
);
$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);


	my $text;

if ($ARGV[0])
    { 
	$text = join ' ', @ARGV; 
	if ($text ne "-"){
        	$nt->update( { status => "Listening to $text"});
	}
    }


上記のperlを利用したC++プログラムが以下になります

WMPの曲情報を発言する。

ActivePerlを"C:Perl"にインストールしているのが条件です

このままだとコマンドプロンプトが表示されて嫌だとか思うのでしたら

int main(...){...}

int WINAPI WinMain(...){...}
って書き直して、なんとなく動くように頑張ってください

#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <process.h>
#include <sys/types.h>


// 定数
#define WINDOW_WIDTH  (400)		// ウィンドウの幅
#define WINDOW_HEIGHT (300)		// ウィンドウの高さ
#define WINDOW_X ((GetSystemMetrics( SM_CXSCREEN ) - WINDOW_WIDTH ) / 2)
#define WINDOW_Y ((GetSystemMetrics( SM_CYSCREEN ) - WINDOW_HEIGHT ) / 2)

// プロトタイプ宣言
HWND Create(HINSTANCE hInst);
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
void sprit(TCHAR* str,TCHAR *a[8]);

// 開始位置
int main(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
	HWND hWnd;
	MSG msg;

	// ウィンドウを作成する
	hWnd = Create( hInst );
	if( hWnd == NULL )
	{
		MessageBox( NULL, _T("ウィンドウの作成に失敗しました"), _T("エラー"), MB_OK );
		return 1;
	}

	// ウィンドウを表示する
	//ShowWindow( hWnd, SW_SHOW );
	//UpdateWindow( hWnd );

	// メッセージループ
	while( 1 )
	{
		BOOL ret = GetMessage( &msg, NULL, 0, 0 );  // メッセージを取得する
		if( ret == 0 || ret == -1 )
		{
			// アプリケーションを終了させるメッセージが来ていたら、
			// あるいは GetMessage() が失敗したら( -1 が返されたら )、ループを抜ける
			break;
		}
		else
		{
			// メッセージを処理する
			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
	}

	return 0;
}

// ウィンドウを作成する
HWND Create(HINSTANCE hInst)
{
	WNDCLASSEX wc;

	// ウィンドウクラスの情報を設定
	wc.cbSize = sizeof(wc);               // 構造体サイズ
	wc.style = CS_HREDRAW | CS_VREDRAW;   // スタイル
	wc.lpfnWndProc = WndProc;             // ウィンドウプロシージャ
	wc.cbClsExtra = 0;                    // 拡張情報1
	wc.cbWndExtra = 0;                    // 拡張情報2
	wc.hInstance = hInst;                 // インスタンスハンドル
	wc.hIcon = (HICON)LoadImage(          // アイコン
		NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON,
		0, 0, LR_DEFAULTSIZE | LR_SHARED
	);
	wc.hIconSm = wc.hIcon;                // 子アイコン
	wc.hCursor = (HCURSOR)LoadImage(      // マウスカーソル
		NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR,
		0, 0, LR_DEFAULTSIZE | LR_SHARED
	);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // ウィンドウ背景
	wc.lpszMenuName = NULL;                     // メニュー名
	wc.lpszClassName = _T("MsnMsgrUIManager");// ウィンドウクラス名
	
	// ウィンドウクラスを登録する
	if( RegisterClassEx( &wc ) == 0 ){ return NULL; }

	// ウィンドウを作成する
	return CreateWindow(
		wc.lpszClassName,      // ウィンドウクラス名
		_T("Sample Program"),  // タイトルバーに表示する文字列
		WS_OVERLAPPEDWINDOW,   // ウィンドウの種類
		WINDOW_X,              // ウィンドウを表示する位置(X座標)
		WINDOW_Y,              // ウィンドウを表示する位置(Y座標)
		WINDOW_WIDTH,          // ウィンドウの幅
		WINDOW_HEIGHT,         // ウィンドウの高さ
		NULL,                  // 親ウィンドウのウィンドウハンドル
		NULL,                  // メニューハンドル
		hInst,                 // インスタンスハンドル
		NULL                   // その他の作成データ
	);
}

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	TCHAR str[1000],*aaa, sss[1024];
	static LPCTSTR TEST_STR = _T("                                      ");
	COPYDATASTRUCT *cds;
	HDC hDC;
	LPTSTR s;
	TCHAR **a = (TCHAR **)malloc(sizeof(TCHAR *)*8);
	int i;
	for(i=0;i<8;i++)
		a[i] = (TCHAR*)malloc(sizeof(TCHAR)*100);


	switch( msg )
	{
	case WM_COPYDATA:	// WMPから曲情報が送られてきたら
		cds = (COPYDATASTRUCT *)lp;

		_stprintf( str, _T("%s"), (LPTSTR)cds->lpData );
		sprit(str,a);

		_tcscpy(sss,_T("c:/Perl/bin/perl.exe twi.pl Listning to "));
		_tcscat(sss,a[5]);	// アーティスト名 
		_tcscat(sss,_T(" - "));
		_tcscat(sss,a[4]);	// 曲名

		STARTUPINFO sinfo;
		PROCESS_INFORMATION pinfo;
		ZeroMemory( &sinfo, sizeof( STARTUPINFO ) );
		ZeroMemory( &pinfo, sizeof( PROCESS_INFORMATION ) );
		sinfo.cb = sizeof( STARTUPINFO );
		sinfo.dwFlags = STARTF_USESHOWWINDOW;
		sinfo.wShowWindow = SW_SHOWNORMAL;

		CreateProcess(_T("c:/Perl/bin/perl.exe"),sss,NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo);

		free(a);
		return 0;
	case WM_CHAR:           // 文字入力が発生したとき
		_stprintf( str, _T("%cが入力されました"), wp );
		MessageBox( hWnd, str, _T("情報"), MB_OK );
		free(a);
		return 0;

	case WM_DESTROY:        // ウィンドウが破棄されるとき
		PostQuitMessage( 0 );
		free(a);
		return 0;
	}
	free(a);
	return DefWindowProc( hWnd, msg, wp, lp );
}


void sprit(TCHAR *str, TCHAR *a[8]){
	// \0Music\01\0{0} - {1}\0Artist\0Name\0Album\0\0
	//char a[8][100];
	int i,j=0,k=2;
	for(i=0;i<8;i++){
		for(j=0;str[k] != '\0';j++,k++){
			if(str[k] == '\\'){
				k+=2;
				break;
			}
			a[i][j] = str[k];
		}

		a[i][j] = '\0';
	}
		// a[4] = title;
		// a[5] = artist
		// a[6] = album
}