使用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 相关文章推荐
python3编写C/S网络程序实例教程
Aug 25 Python
python中xrange用法分析
Apr 15 Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
使用python实现mqtt的发布和订阅
May 05 Python
python 协程 gevent原理与用法分析
Nov 22 Python
Python实现i人事自动打卡的示例代码
Jan 09 Python
python烟花效果的代码实例
Feb 25 Python
python实现简单俄罗斯方块
Mar 13 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 Python
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
Apr 11 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提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
destoon数据库表说明汇总
2014/07/15 PHP
php以post形式发送xml的方法
2014/11/04 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
Python新手实现2048小游戏
2015/03/31 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
介绍一下grep命令的使用
2012/06/28 面试题
公司部门司机岗位职责
2014/01/03 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
督导岗位职责范本
2015/04/10 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
python 对图片进行简单的处理
2021/06/23 Python
k8s部署redis cluster集群的实现
2021/06/24 Redis
Springboot中如何自动转JSON输出
2022/06/16 Java/Android