使用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实现连接SQLite数据库的方法
Aug 23 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
关于Pytorch MaxUnpool2d中size操作方式
Jan 03 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
python openpyxl模块的使用详解
Feb 25 Python
详解python的xlwings库读写excel操作总结
Feb 26 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实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
利用js canvas实现五子棋游戏
2020/10/11 Javascript
对python append 与浅拷贝的实例讲解
2018/05/04 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
python 格式化输出百分号的方法
2019/01/20 Python
python pandas生成时间列表
2019/06/29 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
一套SQL笔试题
2016/08/14 面试题
施工安全标语
2014/06/07 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
民主生活会汇报材料
2014/12/15 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
Python 数据可视化之Bokeh详解
2021/11/02 Python