使用Python编写一个在Linux下实现截图分享的脚本的教程


Posted in Python onApril 24, 2015

引子

Linux下不支持QQ等功能丰富的IM,虽然可以通过wine运行QQ2012,但是还是喜欢在gtalk群中聊天,gtalk群不支持图片方式,这就要靠我们大家自己来解决了,eleven开放了一个Image上传和显示接口,提供了使用curl来解决,但是我们公司的网络使用squid禁止了curl的访问,所以整天看他们这么爽的分享图片我也不甘心阿,所以就使用Python写了一个分享图片的脚本
实现

使用scrot截图,然后使用urllib2库上传图片,如果存在PyQt4库则会将结果放到剪贴板上,如果不存在则输出,自行复制
代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Author : cold
# E-mail : wh_linux@126.com
# Date : 13/01/21 09:54:39
# Desc : 贴代码和图片
#
import urllib2, json
import mimetools
import mimetypes
import itertools

__host__ = "http://eleveni386.7axu.com"

class Form(object):
 def __init__(self):
  self.form_fields = []
  self.files = []
  self.boundary = mimetools.choose_boundary()
  self.content_type = "application/x-www-form-urlencoded"
  return

 def get_content_type(self):
  return self.content_type

 def add_field(self, name, value):
  self.form_fields.append((name, value))
  return

 def add_file(self, fieldname, filename, fileHandle, mimetype=None):
  body = fileHandle.read()
  if mimetype is None:
   mimetype = ( mimetypes.guess_type(filename)[0]
       or
       'applicatioin/octet-stream')
  self.files.append((fieldname, filename, mimetype, body))
  self.content_type = 'multipart/form-data; boundary=%s' % self.boundary

  return

 def __str__(self):
  parts = []
  part_boundary = '--' + self.boundary

  parts.extend(
   [ part_boundary,
    'Content-Disposition: form-data; name="%s"' % name,
    '',
    value,
    ]
   for name, value in self.form_fields)
  if self.files:
   parts.extend([
    part_boundary,
    'Content-Disposition: form-data; name="%s"; filename="%s"' %\
    (field_name, filename),
    'Content-Type: %s' % content_type,
    '',
    body,
   ] for field_name, filename, content_type, body in self.files)

  flattened = list(itertools.chain(*parts))
  flattened.append('--' + self.boundary + '--')
  flattened.append('')
  return '\r\n'.join(flattened)


class HttpHelper(object):
 def __init__(self, url = None, form = None, method = 'GET'):
  self._url = url
  self._form = form
  self._body = str(form)
  self._method = method
  self._dst_url = None
  if url:
   self.make_request()

 def make_request(self):
  url = self._url
  if not self._url.startswith('http://'):
   url = 'http://' + self._url
  self.request = urllib2.Request(url)
  if self._form:
   self.add_header("Content-Type", self._form.get_content_type())
   self.add_header("Content-Length", len(self._body))
   self.request.add_data(self._body)

 def add_header(self, key, val):
  self.request.add_header(key, val)

 def change(self, url, params = {}, method = 'GET'):
  self._url = url
  self._params = params
  self._method = method
  self.make_request()

 def open(self):
  response = urllib2.urlopen(self.request)
  content = response.read()
  self._dst_url = response.geturl()
  try:
   return json.loads(content)
  except:
   return content

if __name__ == "__main__":
 import argparse
 import os
 parser = argparse.ArgumentParser()
 parser.add_argument(dest="path", nargs="?")
 args = parser.parse_args()
 if args.path:
  path = args.path
 else:
  path = r"/tmp/tmpscrot.png"
  os.system("scrot -s {0}".format(path))
 form = Form()
 filename = os.path.split(path)[-1]
 form.add_file(fieldname='mypic', filename=filename,
     fileHandle=open(path))
 http = HttpHelper( __host__ + '/Image/', form)
 url = http.open()
 try:
  from PyQt4.QtGui import QApplication
  app = QApplication([])
  cb = QApplication.clipboard()
  cb.setText(url)
 except:
  print url

安装

将上面代码保存一个文件,放在PATH路径里,赋予执行权限即可
使用

默认的不跟图片地址则会截图,截图完毕后自动分享,如安装了PyQt4库则会将结果放到剪贴板,如没有则输出结果.如果脚本给了图片路径参数则上传给定路径的图片

Python 相关文章推荐
Python中变量交换的例子
Aug 25 Python
用Python代码来解图片迷宫的方法整理
Apr 02 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
Jul 11 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
python 拼接文件路径的方法
Oct 23 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
机器学习实战之knn算法pandas
Jun 22 Python
Python如何存储数据到json文件
Mar 09 Python
Python3之外部文件调用Django程序操作model等文件实现方式
Apr 07 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 Python
整理Python中常用的conda命令操作
Jun 15 Python
python超详细实现完整学生成绩管理系统
Mar 17 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 #Python
Python的Tornado框架异步编程入门实例
Apr 24 #Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
Apr 24 #Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 #Python
简单说明Python中的装饰器的用法
Apr 24 #Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 #Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 #Python
You might like
php Smarty初体验二 获取配置信息
2011/08/08 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
destoon二次开发入门示例
2014/06/20 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
bootstrap读书笔记之CSS组件(上)
2016/10/17 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python测试人员需要掌握的知识
2018/02/08 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
python字符串循环左移
2019/03/08 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
extern在函数声明中是什么意思
2014/01/19 面试题
介绍下java.util.Arrays类
2012/10/16 面试题
小学生新年寄语
2014/04/03 职场文书
上海世博会口号
2014/06/19 职场文书
师范类求职信
2014/06/21 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB
MySQL存储过程及语法详解
2022/08/05 MySQL
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python