使用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 相关文章推荐
使用Pyrex来扩展和加速Python程序的教程
Apr 13 Python
Python复制文件操作实例详解
Nov 10 Python
用Python将动态GIF图片倒放播放的方法
Nov 02 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
Sep 30 Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 Python
对pandas中to_dict的用法详解
Jun 05 Python
简单了解Python读取大文件代码实例
Dec 18 Python
python 实现简单的FTP程序
Dec 27 Python
详解Django中异步任务之django-celery
Nov 05 Python
Python离线安装各种库及pip的方法
Nov 28 Python
Django后端按照日期查询的方法教程
Feb 28 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
jQuery中removeProp()方法用法实例
2015/01/05 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
2019/12/04 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
Python中的map、reduce和filter浅析
2014/04/26 Python
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
使用CSS3的ruby-position固定注音位置的用法示例
2016/07/05 HTML / CSS
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
上学迟到的检讨书
2014/01/11 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
七夕情人节促销方案
2014/06/07 职场文书
会计电算化专业求职信
2014/06/10 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
六一领导慰问欢迎词
2015/01/26 职场文书
英语投诉信范文
2015/07/03 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB