Python论坛  - 讨论区

标题:[python-chinese] [FW]GT群聊功能开放

2005年09月03日 星期六 21:19

limodou limodou at gmail.com
Sat Sep 3 21:19:25 HKT 2005

原文: http://evaxp.com/ksblog/post/798.html
最新版本为: 1.2

作者主页: http://coders.meta.net.nz/~perry/jabber/confbot.php

-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月03日 星期六 21:43

limodou limodou at gmail.com
Sat Sep 3 21:43:02 HKT 2005

在 05-9-3,limodou<limodou at gmail.com> 写道:
> 原文: http://evaxp.com/ksblog/post/798.html
> 最新版本为: 1.2
> 
> 作者主页: http://coders.meta.net.nz/~perry/jabber/confbot.php
> 

我已经创建了一个 china.python at gmail.com
使用时首先我需要运行confbot.py程序,然后大家就可以把china.python at gmail.com加为好友了。再聊天就可以了。

具体命令见上面的作者主页。有时间汉化一下。

大家也可以自行创建。

-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月03日 星期六 22:08

清风 paradise.qingfeng at gmail.com
Sat Sep 3 22:08:07 HKT 2005

我也跟一个http://www.customizetalk.com/pages/index.php?page=news
定制你的GTalk:)

在 05-9-3,limodou<limodou at gmail.com> 写道:
> 在 05-9-3,limodou<limodou at gmail.com> 写道:
> > 原文: http://evaxp.com/ksblog/post/798.html
> > 最新版本为: 1.2
> >
> > 作者主页: http://coders.meta.net.nz/~perry/jabber/confbot.php
> >
> 
> 我已经创建了一个 china.python at gmail.com
> 使用时首先我需要运行confbot.py程序,然后大家就可以把china.python at gmail.com加为好友了。再聊天就可以了。
> 
> 具体命令见上面的作者主页。有时间汉化一下。
> 
> 大家也可以自行创建。
> 
> --
> I like python!
> My Donews Blog: http://www.donews.net/limodou
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
Blog:http://www.donews.net/changzheng

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月04日 星期日 01:05

Bo Yang boyang at mac.com
Sun Sep 4 01:05:37 HKT 2005

我也报名。在上海。

- ahbei

> 在 05-8-27,Zoom Quiet<zoom.quiet at gmail.com> 写道:
>
>> 在 05-8-27,Hoxide Ma<hoxide_dirac at yahoo.com.cn> 写道:
>>
>>> 继 Zoomq 等一大批在北京的Pythoner行动起来后,
>>> 长三角地区的Pythoner也要有点活动啊~~~~
>>>
>
> 这个好啊,凡是江浙沪的pythoner都出来报个名,冒 
> 个泡。
> 建议到 http://wiki.woodpecker.org.cn/moin/SPUG 冒泡。
> 然后可以根据人员的分布密度来确定地点。
> 虽然苏州杭州上海离的都不远,可以一个来回也要 
> 一天的呢。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月05日 星期一 07:10

saddle saddle at gmail.com
Mon Sep 5 07:10:16 HKT 2005

我也创建了一个 python3 at gmail.com
不过好像网络不太好, 看到limodou加入了,后来bot自己死了又启动,就看不到limodou了。。。
有人已经改进了代码, 可以只有在某个list的人才可以加入, 他还准备移植到c sharp平台
蒙他慷慨, 我把他的代码放上来有兴趣的可以看一下,可能缩进有些问题.
-------------- next part --------------
                                                                                                                                                                                                                                                               
#!/usr/bin/env python
# confbot -- a conference bot for google talk.
# Copyright (C) 2005 Perry Lorier (aka Isomer)
# 
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
#      but WITHOUT ANY WARRANTY; without even the implied warranty of
#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#      GNU General Public License for more details.
# 
#      You should have received a copy of the GNU General Public License
#      along with this program; if not, write to the Free Software
#      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# You will want to change these:
account="conferencebot" # put the name of your bots gtalk account here
server="gmail"
password="gnarff"	# Put the password of your bots gtalk account here
topic="A Chat Room (v1.2.5_unofficial)"
admins=[
	'whoeveryouwant at gmail.com', # Put your gmail account here
	]
# Added by: Lukas (sinisterguy at gmail.com)
# I don't know why i need this but it's here
users=[
       'whoeveryouwant at gmail.com', # I haven't tried taking this code out, but the bot works as-is.
       ]                           # Just put the admin address here (asuming the admin is going
                                   # to be the main user)
resource="conference"  
# Make's the room private by default
make_private_default="yes" # Change to "no" if you want your chat bot to be public by default

# You shouldn't have to change anything below this line --------------------
import socket
import jabber
import xmlstream
import sys
import time
import random
import traceback
import urllib

version='1.2.5_unofficial'
commandchrs = '/)'

logf = open(time.strftime("%Y%m%d%H%M%S.log"),"w")
xmllogf = open("xmllog","w")
last_activity=time.time()
#xmllogf = sys.stderr

try:
	adminfile = open("adminlist.txt","r")
	admins=[i.strip() for i in adminfile.readlines()]
	adminfile.close()
except:
	print "Could not open admin file, creating a new one"

# Added by: Lukas (sinisterguy at gmail.com)
# Opens user list
try:
    usersfile = open("userlist.txt","r")
	users=[i.strip() for i in usersfile.readlines()]
	usersfile.close()

except:
       	print "Could not open user list"
	traceback.print_exc()

con=None

def getdisplayname(x):
	"Changes a user at domain/resource to a displayable nick (user)"
	x=unicode(x)
	if '/' in x:
		x=x[:x.find("/")]
	if '@' in x and x[x.find('@'):]=="@gmail.com":
		x=x[:x.find("@")]
	return x

def getjid(x):
	"returns a full jid from a display name"
	if '@' not in x:
		x=x+"@gmail.com"
	return x

def saveadminlist():
	"Saves the admin list to disk"
	a=open("adminlist.txt","w")
	for i in admins:
		print >>a,i
	a.close()

# Added by: Lukas
# Save's the user list
def saveuserlist():
	"Saves the user list to disk"
	a=open("userlist.txt","w")
	for i in users:
		print >>a,i
	a.close()

def sendtoone(who,msg):
	m = jabber.Message(who,msg)
	m.setType('chat')
	con.send(m)

def sendtoall(msg,butnot=[],including=[]):
	r = con.getRoster()
	print >>logf,time.strftime("%Y-%m-%d %H:%M:%S"),msg.encode("utf-8")
	logf.flush()
	print time.strftime("%Y-%m-%d %H:%M:%S"),msg.encode("utf-8")
	for i in r.getJIDs():
		if getdisplayname(i) in butnot:
			continue
		state=r.getShow(unicode(i))
		if state in ['available','chat',None] or getdisplayname(i) in including:
			sendtoone(i,msg)
			time.sleep(.1)

statuses={}
suppressing=1
def sendstatus(who,txt,msg):
	who = getdisplayname(who)
	if statuses.has_key(who) and statuses[who]==txt:
		return
	statuses[who]=txt
	if not statuses.has_key(who):
		# Suppress initial status
		return
	if suppressing:
		return
	if msg:
		sendtoall('*** %s is %s (%s)' % (who,txt,msg),including=[who])
	else:
		sendtoall('*** %s is %s' % (who,txt),including=[who])

def boot(jid):
	"Remove a user from the chatroom"
	con.send(jabber.Presence(to=jid, type='unsubscribe'))
	con.send(jabber.Presence(to=jid, type='unsubscribed'))
	if statuses.has_key(getdisplayname(jid)):
		del statuses[getdisplayname(jid)]

def cmd(who,msg):
	if " " in msg:
		cmd,msg=msg.split(" ",1)
	else:
		cmd,msg=msg.strip(),""
	if cmd[:1] in commandchrs:
		cmd=cmd[1:]
	if cmd in ["me"]:
		if msg.strip()=="":
			action=random.choice(['jumps','cries','hops','sighs','farts','keels over and dies'])
			sendtoone(who,'*** Usage: /me \nSays an emote as you.  eg "/me %(action)s" shows as "* %(nick)s %(action)s" to everyone else' % {
				"nick" : getdisplayname(who),
				"action" : action,
				})
		else:
			sendtoall('* %s %s' % (getdisplayname(who),msg),butnot=[getdisplayname(who)])
	elif cmd in ["help"]:
		sendtoone(who,"*** Commands: \")help\" \"/me\" \")names\" \")quit\" \")msg\"")
		if who.getStripped() in admins:
			sendtoone(who,'*** Admin commands: ")die" ")addadmin" ")deladmin" ")kick"')
			# Added help section by: Lukas (sinisterguy at gmail.com)
			sendtoone(who,'*** Privacy commands: "/makeprivate" "/makepublic" "/adduser" "/deluser"')
		sendtoone(who,'*** See http://coders.meta.net.nz/~perry/jabber/confbot.php for more details')
	elif cmd in ["names"]:
		r = con.getRoster()
		names=[]
		for i in r.getJIDs():
			state=r.getShow(unicode(i))
			name=getdisplayname(i)
			if i.getStripped() in admins:
				name="@%s" % name
			if state in ['available','chat',None]:
				names.insert(0,name)
			else:
				names.append('(%s)' % name)
		sendtoone(who,'*** Names: %s' % " ".join(names))
	elif cmd in ["quit","leave","exit"]:
		sendtoall('*** Quit: %s (%s)' % (getdisplayname(who),msg))
		boot(who.getStripped())
	elif cmd in ['msg']:
		if not ' ' in msg:
			sendtoone(who,'*** Usage: )msg  ')
		else:
			target,msg = msg.split(' ',1)
			sendtoone(getjid(target),'*%s* %s' % (getdisplayname(who),msg))
			sendtoone(who,'>%s> %s' % (getdisplayname(target),msg))
	elif cmd in ['kick','boot'] and who.getStripped() in admins:
		boot(getjid(msg))
		sendtoall('*** Booted: %s' % msg.strip())
	elif cmd in ['addadmin'] and who.getStripped() in admins:
		admins.append(getjid(msg.strip()))
		sendtoone(who,'*** Added %s' % getjid(msg.strip()))
		sendtoone(getjid(msg.strip()),'*** %s added you as an admin' % getdisplayname(who))
		saveadminlist()
	elif cmd in ['deladmin'] and who.getStripped() in admins:
		if getjid(msg.strip()) in admins:
			admins.remove(getjid(msg.strip()))
			sendtoone(who,'*** Removed %s' % getjid(msg.strip()))
			sendtoone(getjid(msg.strip()),'*** %s removed you as an admin' % getdisplayname(who))
			saveadminlist()
		else:
			sendtoone(who,'*** %s is not an admin' % getjid(msg.strip()))
	elif cmd in ['die'] and who.getStripped() in admins:
		sendtoall('*** Admin shutdown by %s' % who.getStripped())
		sys.exit(1)

        # Added by: Lukas (sinisterguy at gmail.com)
    	elif cmd in ['makeprivate']	and who.getStripped() in admins: # Makes the chat private
                con.setPresenceHandler(presenceCB_private)               # TODO: add privacy checking to notify user if chat is
                sendtoone(who,"*** Chat made private")                   # already private

        elif cmd in ['makepublic']	and who.getStripped() in admins: # Makes the chat public
                con.setPresenceHandler(presenceCB)                       # TODO: add privacy checking to notify user if chat is
                sendtoone(who,"*** Chat made public")                    # already public

        elif cmd in ['adduser'] and who.getStripped() in admins: # Adds authorized users
		users.append(getjid(msg.strip()))
		sendtoone(who,'*** Added %s' % getjid(msg.strip()))
		saveuserlist()

	elif cmd in ['deluser'] and who.getStripped() in admins: # Deletes authorized users
		if getjid(msg.strip()) in users:
			users.remove(getjid(msg.strip()))
			sendtoone(who,'*** Removed %s' % getjid(msg.strip()))
			saveuserlist()
		else:
			sendtoone(who,'*** %s is not a user' % getjid(msg.strip()))
	else:
		sendtoone(who,'Unknown command %s' % cmd)

def messageCB(con,msg):
	if msg.getError()!=None:
		if statuses.has_key(getdisplayname(msg.getFrom())):
			sendstatus(unicode(msg.getFrom()),"away","Blocked")
		boot(msg.getFrom().getStripped())
	elif msg.getBody():
		if len(msg.getBody())>1024:
			sendtoall("*** %s is being a moron trying to flood the channel" % (getdisplayname(msg.getFrom())))
		elif msg.getBody()[:1] in commandchrs:
			cmd(msg.getFrom(),msg.getBody())
		else:
			global suppressing,last_activity
			suppressing=0
			last_activity=time.time()
			sendtoall('<%s> %s' % (getdisplayname(msg.getFrom()),msg.getBody()),
				butnot=[getdisplayname(msg.getFrom())],
				)
			print 'status:',con.getRoster().getShow(msg.getFrom().getStripped()),msg.getFrom().getStripped()
			if con.getRoster().getShow(msg.getFrom()) not in ['available','chat',None]:
				sendtoone(msg.getFrom(),'*** Warning: You are marked as "busy" in your client,\nyou will not see other people talk,\nset yourself "available" in your client to see their replies.')
	xmllogf.flush() # just so flushes happen regularly


def presenceCB(con,prs):
	who = unicode(prs.getFrom())
	type = prs.getType()
	# TODO: Try only acking their subscription when they ack ours.
	if type == 'subscribe':
		con.send(jabber.Presence(to=who, type='subscribed'))
		con.send(jabber.Presence(to=who, type='subscribe'))
		print "Subscribe from",who
	elif type == 'unsubscribe':
		boot(prs.getFrom().getStripped())
		print "Unsubscribe from",who
	elif type == 'subscribed':
		sendtoone(who,"""Welcome to ConferenceBot %(version)s
By Perry Lorier (Isomer)
This conference bot is set up to allow groups of people to chat.
")help" to list commands, ")quit" to quit
""" % {
			"version" : version, # Change the default greeting if you wish
			})
		sendstatus(who,'here','joining')
#5982 679c 4f60 8bf4 4e2d 6587 ff0c 8bf7 7528 cnbetabot at gmail.com
	elif type == 'unsubscribed':
		sendtoall('%s has left' % getdisplayname(who))
	elif type == 'available' or type == None:
		show = prs.getShow()
		if show in [None,'chat','available']:
			sendstatus(who,'here',prs.getStatus())
		elif show in ['xa']:
			sendstatus(who,'away',prs.getStatus())
		elif show in ['away']:
			sendstatus(who,'away',prs.getStatus())
		elif show in ['dnd']:
			sendstatus(who,'away',prs.getStatus())
		else:
			sendstatus(who,'away',show+" [[%s]]" % prs.getStatus())

	elif type == 'unavailable':
		status = prs.getShow()
		sendstatus(who,'away',status)
	else:
		print "Unknown presence:",who,type

def presenceCB_private(con,prs): # Presence handler for private chat
	who = unicode(prs.getFrom())
	type = prs.getType()
	# TODO: Try only acking their subscription when they ack ours.
	if type == 'subscribe':
		con.send(jabber.Presence(to=who, type='subscribed'))
		con.send(jabber.Presence(to=who, type='subscribe'))
		print "Subscribe from",who
	elif type == 'unsubscribe':
		boot(prs.getFrom().getStripped())
		print "Unsubscribe from",who
	elif type == 'subscribed':
                # Changes by: Lukas (sinisterguy at gmail.com)
                # Checks the user list (userlist.txt) for the
                # requesting party. Boots the user if unauthorized
                # (name not found in list).
                if prs.getFrom().getStripped() in users:
                        sendtoone(who,"""Welcome to ConferenceBot %(version)s 
By Perry Lorier (Isomer)
This conference bot is set up to allow groups of people to chat.
")help" to list commands, ")quit" to quit""" % {
			"version" : version, # Change the default greeting if you wish
			})
                        sendstatus(who,'here','joining')
                else:
                        sendtoone(who,"""\n*** You do not have permission to use this chat bot.
To request authorization, please IM or email me at sinisterguy at gmail.com""")
                        boot(who)
                        
	elif type == 'unsubscribed':
		sendtoall('%s has left' % getdisplayname(who))
	elif type == 'available' or type == None:
		show = prs.getShow()
		if show in [None,'chat','available']:
			sendstatus(who,'here',prs.getStatus())
		elif show in ['xa']:
			sendstatus(who,'away',prs.getStatus())
		elif show in ['away']:
			sendstatus(who,'away',prs.getStatus())
		elif show in ['dnd']:
			sendstatus(who,'away',prs.getStatus())
		else:
			sendstatus(who,'away',show+" [[%s]]" % prs.getStatus())

	elif type == 'unavailable':
		status = prs.getShow()
		sendstatus(who,'away',status)
	else:
		print "Unknown presence:",who,type

def iqCB(con,iq):
	# reply to all IQ's with an error
	reply=None
	try:
		# Google are bad bad people
		# they don't put their query inside a  in 
		reply=jabber.Iq(to=iq.getFrom(),type='error')
		stuff=iq._node.getChildren()
		for i in stuff:
			reply._node.insertNode(i)
		reply.setError('501','Feature not implemented')
		con.send(reply)
	except:
		traceback.print_exc()

def disconnectedCB(con):
	sys.exit(1)

con = jabber.Client(host=server,debug=False ,log=xmllogf,
                    port=5223, connection=xmlstream.TCP_SSL)
con.connect()
con.setMessageHandler(messageCB)
# Added by: Lukas (sinisterguy at gmail.com)
if make_private_default == "no": # Checks default privacy setting, adjusts privacy handler appropraitely
        con.setPresenceHandler(presenceCB)
else:
        con.setPresenceHandler(presenceCB_private)
con.setIqHandler(iqCB)
con.setDisconnectHandler(disconnectedCB)
con.auth(account,password,resource)
con.requestRoster()
con.sendInitPresence()
_roster = con.getRoster()
for jid in _roster.getJIDs():
	print jid,_roster.getOnline(jid),_roster.getStatus(jid),_roster.getShow(jid)

JID="%s@%s/%s" % (account,server,resource)
last_update=0
saveadminlist()
while 1:
	# We announce ourselves to a url, this url then keeps track of all
	# the conference bots that are running, and provides a directory
	# for people to browse.
	if time.time()-last_update>4*60*60: # every 4 hours
		args={
			'action':'register',
			'account':"%s@%s" % (account,server),
			'users':len(con.getRoster().getJIDs()),
			'last_activity':time.time()-last_activity,
			'version':version,
			'topic':topic,
			}
		try:
			urllib.urlretrieve('http://coders.meta.net.nz/~perry/jabber/confbot.php?'+urllib.urlencode(args))
			print "Updated directory site"
		except:
			print "Can't reach the directory site"
			traceback.print_exc()
		last_update = time.time()
	con.process(1)

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月05日 星期一 08:23

limodou limodou at gmail.com
Mon Sep 5 08:23:34 HKT 2005

在 05-9-5,saddle<saddle at gmail.com> 写道:
> 我也创建了一个 python3 at gmail.com
> 不过好像网络不太好, 看到limodou加入了,后来bot自己死了又启动,就看不到limodou了。。。
> 有人已经改进了代码, 可以只有在某个list的人才可以加入, 他还准备移植到c sharp平台
> 蒙他慷慨, 我把他的代码放上来有兴趣的可以看一下,可能缩进有些问题.
> 

Python 3原来是你创建的啊,我加上,但是说不接受我的加入请求,后来就没试。

-- 
I like python! 
My Donews Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月05日 星期一 08:25

saddle saddle at gmail.com
Mon Sep 5 08:25:39 HKT 2005

不会吧,方便的话再加一次试试, 应该是那个bot自己网络的问题,自己断开了

在 05-9-5,limodou<limodou at gmail.com> 写道:
> 在 05-9-5,saddle<saddle at gmail.com> 写道:
> > 我也创建了一个 python3 at gmail.com
> > 不过好像网络不太好, 看到limodou加入了,后来bot自己死了又启动,就看不到limodou了。。。
> > 有人已经改进了代码, 可以只有在某个list的人才可以加入, 他还准备移植到c sharp平台
> > 蒙他慷慨, 我把他的代码放上来有兴趣的可以看一下,可能缩进有些问题.
> >
> 
> Python 3原来是你创建的啊,我加上,但是说不接受我的加入请求,后来就没试。
> 
> --
> I like python!
> My Donews Blog: http://www.donews.net/limodou
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月05日 星期一 09:39

transbuerg tian accesine.python at gmail.com
Mon Sep 5 09:39:48 HKT 2005

Ó¦¸ÃÊÇÓÐ bug Îҵijö´íÐÅÏ¢£º



D:\python>python confbot.py
therothinator at gmail.com offline None None
oicq2005 at gmail.com offline None None
michaelmurdock at gmail.com offline None None
moonese at gmail.com offline None None
palermo82 at gmail.com offline None None
david.dong.liu at gmail.com offline None None
liuhongru at gmail.com offline None None
shijiakang at gmail.com offline None None
isomer at gmail.com offline None None
cgwfnh at gmail.com offline None None
newblue at gmail.com offline None None
wangcs at gmail.com offline None None
ernie.s at gmail.com offline None None
Updated directory site
2005-09-05 09:37:58  先给你个教程吧,地址如下
status: None oicq2005 at gmail.com
2005-09-05 09:38:03  
http://www.51nb.com/modules.php?name=Sections&op;=
viewarticle&artid;=309
status: None oicq2005 at gmail.com
Traceback (most recent call last):
File "confbot.py", line 307, in ?
con.process(1)
File "D:\python\xmlstream.py", line 459, in process
if not len(self.read()): # length of 0 means disconnect
File "D:\python\xmlstream.py", line 398, in read
data_in=data_in+self._sslObj.read(BLOCK_SIZE).decode('utf-8')
socket.sslerror: (6, 'TLS/SSL connection has been closed')




Çë´ó¼Ò°ïÖú½â¾ö¡£

On 9/5/05, saddle <saddle at gmail.com> wrote:
> 
> ²»»á°É£¬·½±ãµÄ»°ÔÙ¼ÓÒ»´ÎÊÔÊÔ£¬ Ó¦¸ÃÊÇÄǸöbot×Ô¼ºÍøÂçµÄÎÊÌ⣬×Ô¼º¶Ï¿ªÁË
> 
> ÔÚ 05-9-5£¬limodou<limodou at gmail.com> дµÀ£º
> > ÔÚ 05-9-5£¬saddle<saddle at gmail.com> дµÀ£º
> > > ÎÒÒ²´´½¨ÁËÒ»¸ö python3 at gmail.com
> > > ²»¹ýºÃÏñÍøÂ粻̫ºÃ£¬ ¿´µ½limodou¼ÓÈëÁË£¬ºóÀ´bot×Ô¼ºËÀÁËÓÖÆô¶¯£¬¾Í¿´²»µ½limodouÁË¡£¡£¡£
> > > ÓÐÈËÒѾ­¸Ä½øÁË´úÂ룬 ¿ÉÒÔÖ»ÓÐÔÚij¸ölistµÄÈ˲ſÉÒÔ¼ÓÈ룬 Ëû»¹×¼±¸ÒÆÖ²µ½c sharpƽ̨
> > > ÃÉËû¿¶¿®£¬ ÎÒ°ÑËûµÄ´úÂë·ÅÉÏÀ´ÓÐÐËȤµÄ¿ÉÒÔ¿´Ò»ÏÂ,¿ÉÄÜËõ½øÓÐЩÎÊÌâ.
> > >
> >
> > Python 3Ô­À´ÊÇÄã´´½¨µÄ°¡£¬ÎÒ¼ÓÉÏ£¬µ«ÊÇ˵²»½ÓÊÜÎҵļÓÈëÇëÇ󣬺óÀ´¾ÍûÊÔ¡£
> >
> > --
> > I like python!
> > My Donews Blog: http://www.donews.net/limodou
> >
> > _______________________________________________
> > python-chinese list
> > python-chinese at lists.python.cn
> > http://python.cn/mailman/listinfo/python-chinese
> >
> >
> >
> 
> _______________________________________________
> python-chinese list
> python-chinese at lists.python.cn
> http://python.cn/mailman/listinfo/python-chinese
> 
> 
> 


-- 
ÎÒҪȥ¹ðÁÖ

http://www.domolo.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050905/3e665ade/attachment.html

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月05日 星期一 09:47

limodou limodou at gmail.com
Mon Sep 5 09:47:41 HKT 2005

1NogMDUtOS01o6x0cmFuc2J1ZXJnIHRpYW48YWNjZXNpbmUucHl0aG9uQGdtYWlsLmNvbT4g0LS1
wKO6Cj4g06a4w8rH09AgYnVnICAgztK1xLP2tO3Qxc+io7oKPiAgCj4gIAo+ICAKPiAgRDpccHl0
aG9uPnB5dGhvbiBjb25mYm90LnB5Cj4gIHRoZXJvdGhpbmF0b3JAZ21haWwuY29tIG9mZmxpbmUg
Tm9uZSBOb25lCj4gIG9pY3EyMDA1QGdtYWlsLmNvbSBvZmZsaW5lIE5vbmUgTm9uZQo+ICBtaWNo
YWVsbXVyZG9ja0BnbWFpbC5jb20gb2ZmbGluZSBOb25lIE5vbmUKPiAgbW9vbmVzZUBnbWFpbC5j
b20gb2ZmbGluZSBOb25lIE5vbmUKPiAgcGFsZXJtbzgyQGdtYWlsLmNvbSBvZmZsaW5lIE5vbmUg
Tm9uZQo+ICBkYXZpZC5kb25nLmxpdUBnbWFpbC5jb20gb2ZmbGluZSBOb25lIE5vbmUKPiAgbGl1
aG9uZ3J1QGdtYWlsLmNvbSBvZmZsaW5lIE5vbmUgTm9uZQo+ICBzaGlqaWFrYW5nQGdtYWlsLmNv
bSBvZmZsaW5lIE5vbmUgTm9uZQo+ICBpc29tZXJAZ21haWwuY29tIG9mZmxpbmUgTm9uZSBOb25l
Cj4gIGNnd2ZuaEBnbWFpbC5jb20gb2ZmbGluZSBOb25lIE5vbmUKPiAgbmV3Ymx1ZUBnbWFpbC5j
b20gb2ZmbGluZSBOb25lIE5vbmUKPiAgd2FuZ2NzQGdtYWlsLmNvbSBvZmZsaW5lIE5vbmUgTm9u
ZQo+ICBlcm5pZS5zQGdtYWlsLmNvbSBvZmZsaW5lIE5vbmUgTm9uZQo+ICBVcGRhdGVkIGRpcmVj
dG9yeSBzaXRlCj4gIDIwMDUtMDktMDUgMDk6Mzc6NTggPG9pY3EyMDA1PiDlhYjnu5nkvaDkuKrm
lZnnqIvlkKfvvIzlnLDlnYDlpoLkuIsKPiAgc3RhdHVzOiBOb25lIG9pY3EyMDA1QGdtYWlsLmNv
bQo+ICAyMDA1LTA5LTA1IDA5OjM4OjAzIDxvaWNxMjAwNT4KPiBodHRwOi8vd3d3LjUxbmIuY29t
L21vZHVsZXMucGhwP25hbWU9U2VjdGlvbnMmb3A9Cj4gIHZpZXdhcnRpY2xlJmFydGlkPTMwOQo+
ICBzdGF0dXM6IE5vbmUgb2ljcTIwMDVAZ21haWwuY29tCj4gIFRyYWNlYmFjayAobW9zdCByZWNl
bnQgY2FsbCBsYXN0KToKPiAgICBGaWxlICJjb25mYm90LnB5IiwgbGluZSAzMDcsIGluID8KPiAg
ICAgIGNvbi5wcm9jZXNzKDEpCj4gICAgRmlsZSAiRDpccHl0aG9uXHhtbHN0cmVhbS5weSIsIGxp
bmUgNDU5LCBpbiBwcm9jZXNzCj4gICAgICBpZiBub3QgbGVuKHNlbGYucmVhZCgpKTogIyBsZW5n
dGggb2YgMCBtZWFucyBkaXNjb25uZWN0Cj4gICAgRmlsZSAiRDpccHl0aG9uXHhtbHN0cmVhbS5w
eSIsIGxpbmUgMzk4LCBpbiByZWFkCj4gICAgIAo+IGRhdGFfaW49ZGF0YV9pbitzZWxmLl9zc2xP
YmoucmVhZChCTE9DS19TSVpFKS5kZWNvZGUoJ3V0Zi04JykKPiAgc29ja2V0LnNzbGVycm9yOiAo
NiwgJ1RMUy9TU0wgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQnKQo+ICAKCs34wueyu87ItqjB
qr3Tts/By6GjCgotLSAKSSBsaWtlIHB5dGhvbiEgCk15IERvbmV3cyBCbG9nOiBodHRwOi8vd3d3
LmRvbmV3cy5uZXQvbGltb2RvdQo=

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月05日 星期一 10:17

panhudie nirvana117 at gmail.com
Mon Sep 5 10:17:48 HKT 2005

 就是pyqq好像没有动静了, 不过可以用这个bot来作qq的代理
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20050905/3209c5fc/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年09月05日 星期一 10:38

Zoom Quiet zoom.quiet at gmail.com
Mon Sep 5 10:38:30 HKT 2005

在 05-9-5,panhudie<nirvana117 at gmail.com> 写道:
>  
> 就是pyqq好像没有动静了,  不过可以用这个bot来作qq的代理
一定是跟腾讯谈崩了,那帮人不是好鸟没有办法理性合作的…………


-- 
[Time is unimportant, only life important!]

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号