迷津,绝对迷津,我那个抓狂啊!求指点

软件和网站开发以及相关技术探讨
回复
头像
ouch_ouch
帖子: 217
注册时间: 2010-12-24 19:52

迷津,绝对迷津,我那个抓狂啊!求指点

#1

帖子 ouch_ouch » 2011-03-23 22:44

新浪微博提供了Python语言的API,而我用c写的函数调用一个py的模块企图授权,但总是错误。而看起来PIN码是正确的传递过去了,但总是不行。

而用另一个py的文件来调用这个收权用的模块就可以。

我也做了很多猜测,但一一被试验否定了。

代码: 全选

#-*-coding:utf-8-*-
#!/usr/bin/env python
'''login.py'''

import sys
sys.path.append('../wbAPI')
from weibopy.auth import OAuthHandler
from weibopy.api import API
consumer_key='3293249743'
consumer_secret='5b5d765dd4531b69be88aade2d22ec40'
auth=OAuthHandler(consumer_key,consumer_secret)
def get_url():
	auth_url = auth.get_authorization_url()
	print auth_url
	return auth_url

#

def authorize(pin):
	print "in py",pin

	auth.get_access_token(pin)
	api=API(auth)
	friendsmsg=api.friends_timeline(count=200,page=1)
	print friendsmsg[2].text
def getpin():
	pin=int(raw_input("PIN:"))
	authorize(pin)
	
#这个是用来测试的
if __name__=="__main__":
	get_url()
#	//pin=raw_input("pin:")
	getpin()
#	authorize(pin)
顶人一帖,胜造七级浮屠。。。
头像
ouch_ouch
帖子: 217
注册时间: 2010-12-24 19:52

Re: 迷津,绝对迷津,我那个抓狂啊!求指点

#2

帖子 ouch_ouch » 2011-03-23 22:50

c++函数:

代码: 全选

#include <python2.6/Python.h>
#include <iostream>
#include "header/callpython.h"      //这是一个自定义头文件,是下列函数的声明
using namespace std;

//几个产生python函数参数的函数
PyObject* create_para(int data)
{
	Py_Initialize();
	PyObject *pParm;
	pParm=PyTuple_New(1);
	PyTuple_SetItem(pParm,0,Py_BuildValue("i",data));
	return pParm;
}
PyObject* create_para(int nums,int data[])
{
	Py_Initialize();//要初始化python函数才能使用相关的函数
	PyObject *pParm;
	pParm=PyTuple_New(nums);
	int i=0;
	PyTuple_SetItem(pParm,0,Py_BuildValue("i",data[0]));
	for(;i<nums;i++)
	{
			PyTuple_SetItem(pParm,i,Py_BuildValue("i",data[i]));
	}
	return pParm;

}
PyObject* create_para(PyObject *p)
{
	Py_Initialize();
	PyObject *pParm;
	pParm=PyTuple_New(1);
	PyTuple_SetItem(pParm,0,Py_BuildValue("o",p));
	return pParm;
}
PyObject* create_para(int nums,char* data[])
{
	Py_Initialize();
	PyObject *pParm;
	pParm=PyTuple_New(nums);
	int i=0;
	for(;i<nums;i++)
	{
			PyTuple_SetItem(pParm,i,Py_BuildValue("s",data[i]));
	}
	return pParm;
}

//运行几个python单句,事实上,我可通过这个函数来授权
int runpy(int cnt,char* str[])
{
	Py_Initialize();
	if(!Py_IsInitialized())
	{
		cout<<"初始化失败!"<<endl;
		return -1;
	}
	for(int i=0;i<cnt;i++)
		PyRun_SimpleString(str[i]);
	return 0;
}
//调用python 函数的函数
int callpy(int flag,char *name,char* funcName,PyObject* para,struct result_py &py_return)
{
	PyObject *modelname,*model,*dict,*func,*pRetVal;
	Py_Initialize();//初始化python
	if(!Py_IsInitialized())
	{
		cout<<"初始化失败!"<<endl;
		return -1;
	}
	//导入sys模块,
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./wbAPI')");          //这是我放自己写的模块的路径
	PyRun_SimpleString("sys.path.append('./pymodule')");   //这是新浪微波SDK的路径
	//导入python模块
	modelname=PyString_FromString(name);
	model=PyImport_Import(modelname);
	if(!model)
	{
		cout<<"找不到模块"<<name<<endl;
		return -1;
	}
	dict=PyModule_GetDict(model);
	if(!dict)
	{
		cout<<"获取字典失败!\n";
		return -1;
	}
	func=PyDict_GetItemString(dict,funcName);
	if(!func||!PyCallable_Check(func))
	{
		cout<<"函数无效"<<endl;
		return -1;
	}

	pRetVal=PyEval_CallObject(func,para);
//结构体result_py用来接受调用py函数的返回值,在头文件callpython中定义
//flag为返回值类型的标志,在callpython定义的宏
	if(flag==1)    //返回字符串
	{
		PyArg_Parse(pRetVal,"s",py_return.py_str);	
	}
	if(flag==0) //返回整数
		PyArg_Parse(pRetVal,"i",&py_return.py_int);
	if(flag==2)  //企图放回py的对象,没试过
		py_return.py_object=pRetVal;
	
	
	Py_Finalize();
	return 0;
	
}
顶人一帖,胜造七级浮屠。。。
回复