Twitcurlを用いたTwitterクライアントプログラムの開発

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DAICHI0922
記事: 26
登録日時: 1年前

Twitcurlを用いたTwitterクライアントプログラムの開発

#1

投稿記事 by DAICHI0922 » 7ヶ月前

Twitcurlをダウンロードし、展開して以下のプログラムを書きました。

追加のインクルードライブラリにはtwitcurl.hが入っているディレクトリを指定し、twitcurl.libはカレントディレクトリ内に置いています。

実行すると、以下のようなエラーが出ます。

LNK2038 '_MSC_VER' の不一致が検出されました。値 '1600' が 1900 の値 'Source.obj' と一致しません。
LNK2001 外部シンボル ""__declspec(dllimport) public: __thiscall std::exception::exception(char const * const &)" (__imp_??0exception@std@@QAE@ABQBD@Z)" は未解決です。

のようなエラーが多量に出ます。
どこがおかしいのでしょうか。
使用コンパイラはVisualStudio2017でOSはWindows10です

コード:

#include <iostream>
#include <string>
#include <twitcurl.h>
#pragma comment(lib,"twitcurl.lib")
using namespace std;

/*
* [CLASS] Process
*/
class Proc
{
twitCurl twitterObj;
string strConsumerKey, strConsumerSecret;
string strAccessTokenKey, strAccessTokenSecret;
string strReplyMsg;
public:
Proc(); // Constructor
bool execMain(string); // Main Process
};

/*
* Proc - Constructor
*/
Proc::Proc()
{
// Initialize
strConsumerKey = "あえて空白";
strConsumerSecret = "あえて空白";
strAccessTokenKey = "あえて空白";
strAccessTokenSecret = "あえて空白";
}

/*
* Main Process
*/
bool Proc::execMain(string strString)
{
try {
// Set Twitter consumer key and secret,
// OAuth access token key and secret
twitterObj.getOAuth().setConsumerKey(strConsumerKey);
twitterObj.getOAuth().setConsumerSecret(strConsumerSecret);
twitterObj.getOAuth().setOAuthTokenKey(strAccessTokenKey);
twitterObj.getOAuth().setOAuthTokenSecret(strAccessTokenSecret);

// Verify account credentials
if (!twitterObj.accountVerifyCredGet()) {
twitterObj.getLastCurlError(strReplyMsg);
cout << "\ntwitCurl::accountVerifyCredGet error:\n"
<< strReplyMsg.c_str() << endl;
return false;
}

// Post a message
strReplyMsg = "";
if (!twitterObj.statusUpdate(strString)) {
twitterObj.getLastCurlError(strReplyMsg);
cout << "\ntwitCurl::statusUpdate error:\n"
<< strReplyMsg.c_str() << endl;
return false;
}
}
catch (char *e) {
cout << "[EXCEPTION] " << e << endl;
return false;
}
return true;
}

/*
* Execution
*/
int main(int argc, char* argv[]) {
try {
if (argc != 2) {
cout << "Usage: ./Twitcurl sentence" << endl;
return true;
}
Proc objMain;
bool bRet = objMain.execMain(argv[1]);
if (!bRet) cout << "ERROR!" << endl;
}
catch (char *e) {
cout << "[EXCEPTION] " << e << endl;
return 1;
}
return 0;
}

Math

Re: Twitcurlを用いたTwitterクライアントプログラムの開発

#2

投稿記事 by Math » 7ヶ月前

_MSC_VER'  が 1600 ということは Visual Studio 2010
        1900 ということは Visual Studio 2015 です
VisualStudio2017は 1910

ですから大分前のバージョンで作ってあるので ソリューションの再ターゲットをやってみてください

DAICHI0922
記事: 26
登録日時: 1年前

Re: Twitcurlを用いたTwitterクライアントプログラムの開発

#3

投稿記事 by DAICHI0922 » 7ヶ月前

ありがとうございます。
最新のSDKに合わしてみたところ、LNK2038は出なくなりました。
しかし、以下のようなエラーが出てしまいます。

LNK2019 未解決の外部シンボル "public: __cdecl twitCurl::twitCurl(void)" (??0twitCurl@@QEAA@XZ) が関数 "public: __cdecl Proc::Proc(void)" (??0Proc@@QEAA@XZ) で参照されました。 場所:Source.obj

ソースファイルはSource.cppだけですし、その中にtwitCurlなんて関数は使用していません。libがちゃんと指定できていないのかなと思いましたが、きちんとカレントディレクトリ内に置いています。なによりプラグマを取るとtwitcurl.hがincludeできないようなのでこの線は無いようです。

どうすればいいでしょうか?

Math

Re: Twitcurlを用いたTwitterクライアントプログラムの開発

#4

投稿記事 by Math » 7ヶ月前

twitCurl::twitCurl(void) はスーパークラスのコンストラクタかもしれませんね。

私はライブラリーは通常ここに指定しますね。
http://www2.koyoen.birdview.co.jp/~abcx ... -11-p-.PNG

DAICHI0922
記事: 26
登録日時: 1年前

Re: Twitcurlを用いたTwitterクライアントプログラムの開発

#5

投稿記事 by DAICHI0922 » 7ヶ月前

ありがとうございます。
Twitcurlはマルチスレッドデバッグに対応していないことがわかり、修正しました。

コードは変わってしまうのですが、Twitterのアクセストークンをユーザー名とパスワードから出すにはどのようにしたらいいのでしょうか。ネットのサンプルとTwitcurl公式の説明を繋ぎ合わして以下のコードを書いたのですが、{"errors":[{"code":89,"message":"Invalid or expired token."}]}という応答が帰ってきます。つまりアクセストークンが上手く取得できていないということです。

どこがおかしいかご教授いただけると幸いです。

コード:

#include <stdio.h>
#include <iostream>
#include <fstream>
#include "twitcurl.h"
#pragma comment(lib,"legacy_stdio_definitions.lib")

using namespace std;

int main(){

	string tweet;
	cout << "Tweet > "; cin >> tweet;

	string userName("UsersName");  //ユーザ名
	string passWord("PassWord");  //パスワード

	string myConsumerKey("0000");
	string myConsumerSecuret("0000");

	//string myOAuthAccessTokenKey("0000");
	//string myOAuthAccessTokenSecret("0000");

	string myOAuthAccessTokenKey;
	string myOAuthAccessTokenSecret;

	ifstream oAuthTokenKeyIn;
	ifstream oAuthTokenSecretIn;

	twitCurl twitterObj;
	string tmpStr;
	string replyMsg;
	char tmpBuf[1024];

	/* Set twitter username and password */
	twitterObj.setTwitterUsername(userName);
	twitterObj.setTwitterPassword(passWord);

	/* OAuth flow begins */
	twitterObj.getOAuth().setConsumerKey(myConsumerKey);
	twitterObj.getOAuth().setConsumerSecret(myConsumerSecuret);

	/* Step 1: Check if we alredy have OAuth access token from a previous run */
	oAuthTokenKeyIn.open("twitterClient_token_key.txt");
	oAuthTokenSecretIn.open("twitterClient_token_secret.txt");

	memset(tmpBuf, 0, 1024);
	oAuthTokenKeyIn >> tmpBuf;
	myOAuthAccessTokenKey = tmpBuf;

	memset(tmpBuf, 0, 1024);
	oAuthTokenSecretIn >> tmpBuf;
	myOAuthAccessTokenSecret = tmpBuf;

	oAuthTokenKeyIn.close();
	oAuthTokenSecretIn.close();

	if (myOAuthAccessTokenKey.size() && myOAuthAccessTokenSecret.size()){
		/* If we already have these keys, then no need to go through auth again */
		printf("\nUsing:\nKey: %s\nSecret: %s\n\n",	myOAuthAccessTokenKey.c_str(), myOAuthAccessTokenSecret.c_str());

		twitterObj.getOAuth().setOAuthTokenKey(myOAuthAccessTokenKey);
		twitterObj.getOAuth().setOAuthTokenSecret(myOAuthAccessTokenSecret);
	}
	else{
		/* Step 2: Get request token key and secret */
		string authUrl;
		twitterObj.oAuthRequestToken(authUrl);

		/* Step 3: Get PIN  */
		/* pass auth url to twitCurl and get it via twitCurl PIN handling */
		twitterObj.oAuthHandlePIN(authUrl);

		/* Step 4: Exchange request token with access token */
		twitterObj.oAuthAccessToken();

		/* Step 5: save this access token key and secret for future use */
		twitterObj.getOAuth().getOAuthTokenKey(myOAuthAccessTokenKey);
		twitterObj.getOAuth().getOAuthTokenSecret(myOAuthAccessTokenSecret);

		/* Step 6: Save these keys in a file or wherever */
		ofstream oAuthTokenKeyOut;
		ofstream oAuthTokenSecretOut;

		oAuthTokenKeyOut.open("twitterClient_token_key.txt");
		oAuthTokenSecretOut.open("twitterClient_token_secret.txt");

		oAuthTokenKeyOut.clear();
		oAuthTokenSecretOut.clear();

		oAuthTokenKeyOut << myOAuthAccessTokenKey.c_str();
		oAuthTokenSecretOut << myOAuthAccessTokenSecret.c_str();

		oAuthTokenKeyOut.close();
		oAuthTokenSecretOut.close();
	}
	/* OAuth flow ends */

	/* Account credentials verification */
	if (twitterObj.accountVerifyCredGet()){
		twitterObj.getLastWebResponse(replyMsg);
		printf("\naccountVerifyCredGet web response:\n%s\n", replyMsg.c_str());
	}
	else{
		twitterObj.getLastCurlError(replyMsg);
		printf("\naccountVerifyCredGet error:\n%s\n", replyMsg.c_str());
	}

	/* Post a new status message */
	tmpStr = tweet;
	replyMsg = "";
	if (twitterObj.statusUpdate(tmpStr)){
		twitterObj.getLastWebResponse(replyMsg);
		printf("\nstatusUpdate web response:\n%s\n", replyMsg.c_str());
	}
	else{
		twitterObj.getLastCurlError(replyMsg);
		printf("\nstatusUpdate error:\n%s\n", replyMsg.c_str());
	}

	return 0;
}

Math

Re: Twitcurlを用いたTwitterクライアントプログラムの開発

#6

投稿記事 by Math » 7ヶ月前

こういうことは Twitter Develipers Forums に聞かれた方がいいでしょうね。
https://twittercommunity.com/

返信

“C言語何でも質問掲示板” へ戻る