webqq

package
v0.0.0-...-548fb8d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 20, 2016 License: MPL-2.0 Imports: 17 Imported by: 0

Documentation

Index

Constants

View Source
const (
	ClientTypePC      ClientType = 1
	ClientTypePC1                = 2
	ClientTypePC2                = 3
	ClientTypePC3                = 4
	ClientTypePC4                = 5
	ClientTypePC5                = 6
	ClientTypePC6                = 10
	ClientTypeMobile             = 21
	ClientTypeMobile1            = 22
	ClientTypeMobile2            = 23
	ClientTypeMobile3            = 24
	ClientTypeWebQQ              = 41
	ClientTypePad                = 42
)

客户端类型 (TODO:待补完)

View Source
const (
	AddedBuddySig   SystemMessageType = "added_buddy_sig"
	AddedBuddyNosig                   = "added_buddy_nosig"
	VerifyPassAdd                     = "verify_pass_add"
	VerifyPass                        = "verify_pass"
	VerifyRequired                    = "verify_required"
	VerifyRejected                    = "verify_rejected"
)
View Source
const (
	GroupJoin             SysGroupMessageType = "group_join"
	GroupLeave                                = "group_leave"
	GroupRequestJoin                          = "group_request_join"
	GroupRequestJoinAgree                     = "group_request_join_agree"
	GroupRequestJoinDeny                      = "group_request_join_deny"
	GroupAdminOp                              = "group_admin_op"
	GroupCreate                               = "group_create"
)

Variables

View Source
var (
	DefaultFont   = Font{"微软雅黑", 10, []int{0, 0, 0}, "000000"} // 默认字体
	DefaultServer = "112.90.78.75:0"
)

Functions

func GenEncryptPassword

func GenEncryptPassword(uin uint64, passwd_md5 string) (epwd string)

生成加密后的密码

Types

type Account

type Account uint64 // 真实QQ号

func (Account) String

func (u Account) String() string

type Birthday

type Birthday struct {
	Month uint32 `json:"month"`
	Year  uint32 `json:"year"`
	Day   uint32 `json:"day"`
}

生日

type Card

type Card struct {
	Uin  Uin    `json:"muin"`
	Card string `json:"card"`
}

群名片

type Cface

type Cface struct {
	Name   string `json:"name"`
	FileId string `json:"file_id"`
	Key    string `json:"key"`
	Server string `json:"server"`
}

自定义表情 {"file_id":4086436741,"key":"j9v3yUNifMrByvWC","name":"{DC854AD1-A1DB-0855-E267-2CC14D14345A}.gif","server":"112.90.78.75:0"}

type ClientType

type ClientType uint32

type Content

type Content []json.RawMessage

变态结构 [["font",{...}],["offpic",{...},],["cface",{...}],["face",100],"msg",["cface_idx",0]]

func (Content) Decode

func (this Content) Decode() (v ContentModel)

解码

func (Content) EncodeString

func (this Content) EncodeString() string

转化到string

type ContentModel

type ContentModel struct {
	Font     Font
	Message  string
	HasImage bool // 是否有图片
}

正常结构

func (ContentModel) Encode

func (this ContentModel) Encode(webqq *WebQQ) (v Content)

转换到下层对象

type CustomFaceJar

type CustomFaceJar interface {
	GetByGin()
}

储存自定义表情信息的容器

type DiscuId

type DiscuId uint64 // 讨论组号

func (DiscuId) String

func (u DiscuId) String() string

type Event

type Event interface{}

type EventAvRefuse

type EventAvRefuse struct {
	FromUin   Uin    `json:"from_uin"`
	ToUin     Uin    `json:"to_uin"`
	MsgId     uint32 `json:"msg_id"`
	MsgId2    uint32 `json:"msg_id2"`
	MsgType   uint32 `json:"msg_type"`
	ReplyIp   uint32 `json:"reply_ip"`
	Type      uint32 `json:"type"`
	SessionId uint32 `json:"session_id"`
	Time      uint32 `json:"time"`
	Longconn  string `json:"longconn"`
}

"poll_type": "av_refuse"

type EventBuddiesStatusChange

type EventBuddiesStatusChange struct {
	Uin        Uin    `json:"uin"`
	Status     uint32 `json:"status"`
	ClientType uint32 `json:"client_type"`
}

"poll_type": "buddies_status_change"

type EventDiscuMessage

type EventDiscuMessage struct {
	FromUin Uin     `json:"from_uin"`
	ToUin   Uin     `json:"to_uin"`
	MsgId   uint32  `json:"msg_id"`
	MsgId2  uint32  `json:"msg_id2"`
	MsgType uint32  `json:"msg_type"`
	ReplyIp uint32  `json:"reply_ip"`
	DiscuId DiscuId `json:"did"`
	SendUin Uin     `json:"send_uin"`
	Seq     uint64  `json:"seq"`
	Time    uint64  `json:"time"`
	InfoSeq uint64  `json:"info_seq"` // 讨论组号
	Content Content `json:"content"`
}

"poll_type": "discu_message"

type EventFileMessage

type EventFileMessage struct {
	FromUin   Uin    `json:"from_uin"`
	ToUin     Uin    `json:"to_uin"`
	Mode      string `json:"mode"`
	MsgId     uint32 `json:"msg_id"`
	MsgId2    uint32 `json:"msg_id2"`
	MsgType   uint32 `json:"msg_type"`
	ReplyIp   uint32 `json:"reply_ip"`
	Type      uint32 `json:"type"`
	SessionId uint32 `json:"session_id"`
	Time      uint32 `json:"time"`
	InetIp    uint32 `json:"inet_ip"`
}

"poll_type": "file_message"

type EventFileSrvTransfer

type EventFileSrvTransfer struct {
	FromUin   Uin    `json:"from_uin"`
	ToUin     Uin    `json:"to_uin"`
	LcId      uint32 `json:"lc_id"`
	Type      uint32 `json:"type"`
	Operation uint32 `json:"operation"`
	Now       uint32 `json:"now"`
	FileCount uint32 `json:"file_count"`
	FileInfos struct {
		FileName   string `json:"file_name"`
		ProId      uint32 `json:"pro_id"`
		FileStatus uint32 `json:"file_status"`
	} `json:"file_infos"`
}

"poll_type": "filesrv_transfer"

type EventGroupMessage

type EventGroupMessage struct {
	FromUin   Uin     `json:"from_uin"`
	ToUin     Uin     `json:"to_uin"`
	MsgId     uint32  `json:"msg_id"`
	MsgId2    uint32  `json:"msg_id2"`
	MsgType   uint32  `json:"msg_type"`
	ReplyIp   uint32  `json:"reply_ip"`
	GroupCode GCode   `json:"group_code"`
	SendUin   Uin     `json:"send_uin"`
	Seq       uint64  `json:"seq"`
	Time      uint64  `json:"time"`
	InfoSeq   uint64  `json:"info_seq"` // 群号
	Content   Content `json:"content"`
}

"poll_type": "group_message"

type EventGroupWebMessage

type EventGroupWebMessage struct {
	FromUin   Uin    `json:"from_uin"`
	ToUin     Uin    `json:"to_uin"`
	MsgId     uint32 `json:"msg_id"`
	MsgId2    uint32 `json:"msg_id2"`
	MsgType   uint32 `json:"msg_type"`
	ReplyIp   uint32 `json:"reply_ip"`
	GroupType uint32 `json:"group_type"`
	Ver       uint32 `json:"ver"`
	GroupCode GCode  `json:"group_code"`
	SendUin   Uin    `json:"send_uin"`
	Xml       string `json:"xml"`
}

"poll_type": "group_web_message"

type EventInputNotify

type EventInputNotify struct {
	FromUin Uin    `json:"from_uin"`
	ToUin   Uin    `json:"to_uin"`
	MsgId   uint32 `json:"msg_id"`
	MsgId2  uint32 `json:"msg_id2"`
	MsgType uint32 `json:"msg_type"`
	ReplyIp uint32 `json:"reply_ip"`
}

"poll_type": "input_notify"

type EventMessage

type EventMessage struct {
	FromUin Uin     `json:"from_uin"`
	ToUin   Uin     `json:"to_uin"`
	MsgId   uint32  `json:"msg_id"`
	MsgId2  uint32  `json:"msg_id2"`
	MsgType uint32  `json:"msg_type"`
	ReplyIp uint32  `json:"reply_ip"`
	Time    uint64  `json:"time"`
	Content Content `json:"content"`
}

"poll_type": "message"

type EventPushOffFile

type EventPushOffFile struct {
	FromUin    Uin    `json:"from_uin"`
	MsgId      uint32 `json:"msg_id"`
	Rkey       string `json:"rkey"`
	Name       string `json:"name"`
	Ip         string `json:"ip"`
	Port       uint32 `json:"port"`
	Size       uint32 `json:"size"`
	ExpireTime uint32 `json:"expire_time"`
	Time       uint32 `json:"time"`
}

"poll_type": "push_offfile"

type EventShakeMessage

type EventShakeMessage struct {
	FromUin Uin    `json:"from_uin"`
	ToUin   Uin    `json:"to_uin"`
	MsgId   uint32 `json:"msg_id"`
	MsgId2  uint32 `json:"msg_id2"`
	MsgType uint32 `json:"msg_type"`
	ReplyIp uint32 `json:"reply_ip"`
}

"poll_type": "shake_message"

type EventSysGroupMessage

type EventSysGroupMessage struct {
	Type       SysGroupMessageType `json:"type"`
	NewMember  string              `json:"new_member"`
	OldMember  string              `json:"old_member"`
	GCode      GCode               `json:"gcode"`
	RequestUin Uin                 `json:"request_uin"`
	OpType     string              `json:"op_type"` // 0,2:取消管理员 3:成为管理员 255:群主(转让)

}

"poll_type": "sys_g_msg"

type EventSystemMessage

type EventSystemMessage struct {
	Type       SystemMessageType `json:"type"`
	FromUin    Uin               `json:"from_uin"`
	Stat       uint32            `json:"stat"`
	ClientType ClientType        `json:"client_type"`
	GroupId    GCode             `json:"group_id"`
	Msg        string            `json:"msg"`
	Account    Account           `json:"account"`
	Uiuin      Uin               `json:"uiuin"`
}

"poll_type": "system_message"

type Font

type Font struct {
	Name  string `json:"name"`
	Size  uint32 `json:"size"`
	Style []int  `json:"style"`
	Color string `json:"color"`
}

字体 {"name":"宋体","size":"10","style":[0,0,0],"color":"000000"}

type Friend

type Friend struct {
	Uin        Uin   `json:"uin"`
	Flag       int32 `json:"flag"`
	Categories int32 `json:"categories"`
}

好友信息子结构

type FriendInfo

type FriendInfo struct {
	Uin        Uin      `json:"uin"`
	Face       uint32   `json:"face"`
	Allow      uint32   `json:"allow"`
	Constel    uint32   `json:"constel"`
	Blood      uint32   `json:"blood"`
	Stat       uint32   `json:"stat"`
	VipInfo    uint32   `json:"vip_info"`
	Shengxiao  uint32   `json:"shengxiao"`
	ClientType uint32   `json:"client_type"`
	Birthday   Birthday `json:"birthday"`
	Occupation string   `json:"occupation"`
	Phone      string   `json:"phone"`
	College    string   `json:"college"`
	Homepage   string   `json:"homepage"`
	Country    string   `json:"country"`
	City       string   `json:"city"`
	Personal   string   `json:"personal"`
	Nick       string   `json:"nick"`
	Email      string   `json:"email"`
	Province   string   `json:"province"`
	Gender     string   `json:"gender"`
	Mobile     string   `json:"mobile"`
}

用户信息

type FriendJar

type FriendJar interface {
	GetByUin(uin Uin) *FriendInfo
	GetByAccount(acc Account) *FriendInfo
	All() []*FriendInfo
	Put(model *FriendInfo)
	Detele(uin Uin)
}

储存好友信息的容器

type FrientdCategorie

type FrientdCategorie struct {
	Index uint32 `json:"index"`
	Sort  uint32 `json:"sort"`
	Name  string `json:"name"`
}

好友分类子结构

type FrientdInfo

type FrientdInfo struct {
	Uin  Uin    `json:"uin"`
	Face uint32 `json:"face"`
	Flag uint32 `json:"flag"`
	Nick string `json:"nick"`
}

用户简单信息

type GCode

type GCode uint64 // 群信息ID 伪群号 相当于uin

func (GCode) String

func (u GCode) String() string

type GroupId

type GroupId uint64 // 真实群号

func (GroupId) String

func (u GroupId) String() string

type GroupInfo

type GroupInfo struct {
	Face       uint32 `json:"face"`
	Class      uint32 `json:"class"`
	Memo       string `json:"memo"`
	Fingermemo string `json:"fingermemo"`
	Code       GCode  `json:"code"` // 群的信息ID gcode
	Createtime uint64 `json:"createtime"`
	Flag       uint32 `json:"flag"`
	Level      uint32 `json:"level"`
	Name       string `json:"name"`  // 群名
	Gid        Uin    `json:"gid"`   // 群的消息Uin group_uin
	Owner      Uin    `json:"owner"` // 群主Uin
	Members    string `json:"members"`
}

群详细信息

type GroupJar

type GroupJar interface {
	GetByGin(gin GroupId) *GroupInfo
	GetByGroupId(gid GroupId) *GroupInfo
	All() []*GroupInfo

	Detele(gin GCode)
	// contains filtered or unexported methods
}

储存群信息的容器

type GroupName

type GroupName struct {
	Gid  Uin    `json:"gid"`
	Code GCode  `json:"code"`
	Flag uint32 `json:"flag"`
	Name string `json:"name"`
}

群名

type LevelDbFriendJar

type LevelDbFriendJar struct {
	FriendJar
	// contains filtered or unexported fields
}

the implementation of FriendJar

func NewLevelDbFriendJar

func NewLevelDbFriendJar(filename string) (this *LevelDbFriendJar)

func (*LevelDbFriendJar) Get

func (this *LevelDbFriendJar) Get()

func (*LevelDbFriendJar) Put

func (this *LevelDbFriendJar) Put()

type MarkName

type MarkName struct {
	Uin      Uin    `json:"uin"`
	Markname string `json:"markname"`
}

备注

type Member

type Member struct {
	Uin  Uin    `json:"muin"`
	Flag uint32 `json:"mflag"`
}

群成员 0 = 普通成员 84 = 群主 01010100

type MemberInfo

type MemberInfo struct {
	Nick     string `json:"nick"`
	Province string `json:"province"`
	Gender   string `json:"gender"`
	Uin      Uin    `json:"uin"`
	Country  string `json:"country"`
	City     string `json:"city"`
}

群成员信息

type MemberStat

type MemberStat struct {
	Uin        Uin        `json:"uin"`
	ClientType ClientType `json:"client_type"`
	Stat       uint32     `json:"stat"`
}

群成员在线信息

type OfflinePicJar

type OfflinePicJar interface {
	GetByGin()
}

储存离线图片信息的容器

type Offpic

type Offpic struct {
	FilePath string `json:"file_path"`
	Success  int32  `json:"success"`
}

离线图片 success:1 file_path:/32d369de-e2a1-49b7-8b27-249d57bbd5d0

type RawEvent

type RawEvent json.RawMessage

func (RawEvent) ParseEvent

func (data RawEvent) ParseEvent(poll_type string) (v Event, err error)

解析事件

type Result

type Result struct {
	Code int `json:"retcode"`
}

通用 Result结构

type ResultAllowInfo

type ResultAllowInfo struct {
	Code   int `json:"retcode"`
	Result struct {
		Allow uint32 `json:"allow"`
	} `json:"result"`
}

好友验证类型 result结构

type ResultBatchGetVipInfo

type ResultBatchGetVipInfo struct {
	Code   int `json:"retcode"`
	Result struct {
		VipInfo []VipInfo `json:"vipinfo"`
	} `json:"result"`
}

获取VIP信息 result结构

type ResultC2CMsgSig

type ResultC2CMsgSig struct {
	Code   int `json:"retcode"`
	Result struct {
		Type  uint32 `json:"type"`
		Value string `json:"value"`
		Flags struct {
			Text  uint8 `json:"text"`
			Pic   uint8 `json:"pic"`
			File  uint8 `json:"file"`
			Audio uint8 `json:"audio"`
			Video uint8 `json:"video"`
		} `json:"flags"`
	} `json:"result"`
}

获取临时会话Sig result结构

type ResultCreateDiscu

type ResultCreateDiscu struct {
	Code   int `json:"retcode"`
	Result struct {
		Result  uint32  `json:"result"`
		DiscuId DiscuId `json:"did"`
	} `json:"result"`
}

创建讨论组 result结构

type ResultDiscuInfo

type ResultDiscuInfo struct {
	Code   int `json:"retcode"`
	Result struct {
		Info struct {
			DiscuId    DiscuId `json:"did"`
			DiscuOwner Uin     `json:"discu_owner"`
			DiscuName  string  `json:"discu_name"`
			InfoSeq    string  `json:"info_seq"` // 信息序列号
			MemberList []struct {
				Uin     Uin     `json:"mem_uin"`
				Account Account `json:"ruin"`
			} `json:"mem_list"`
		} `json:"info"`
		MemberStatus []MemberStat `json:"mem_status"`
		MemberInfo   struct {
			Uin  Uin    `json:"uin"`
			Nick string `json:"nick"`
		} `json:"mem_info"`
	} `json:"result"`
}

获取讨论组信息 result结构

type ResultDiscusList

type ResultDiscusList struct {
	Code   int `json:"retcode"`
	Result struct {
		Dnamelist []interface{} `json:"dnamelist"`
	} `json:"result"`
}

讨论组列表 result结构

type ResultFriendInfo

type ResultFriendInfo struct {
	Code   int        `json:"retcode"`
	Result FriendInfo `json:"result"`
}

获取好友信息 result结构

type ResultFriendUin

type ResultFriendUin struct {
	Code   int `json:"retcode"`
	Result struct {
		Uin     Uin     `json:"uin"`
		Account Account `json:"account"`
		Uiuin   string  `json:"uiuin"`
	} `json:"result"`
}

获取显示ID result结构

type ResultGfaceSig

type ResultGfaceSig struct {
	Code   int `json:"retcode"`
	Result struct {
		Reply    uint32 `json:"reply"`
		GfaceKey string `json:"gface_key"`
		GfaceSig string `json:"gface_sig"`
	} `json:"result"`
}

发送群聊图片Sig result结构

type ResultGroupInfo

type ResultGroupInfo struct {
	Code   int `json:"retcode"`
	Result []struct {
		Memo  string `json:"memo"`
		GCode GCode  `json:"gcode"`
	} `json:"result"`
}

群信息 result结构

type ResultGroupInfoExt

type ResultGroupInfoExt struct {
	Code   int `json:"retcode"`
	Result struct {
		Stats       []MemberStat `json:"stats"`
		MemberInfos []MemberInfo `json:"minfo"`
		GroupInfo   GroupInfo    `json:"ginfo"`
		Cards       []Card       `json:"cards"`
		VipInfo     []VipInfo    `json:"vipinfo"`
	} `json:"result"`
}

群详细信息 result结构

type ResultGroupMemberStat

type ResultGroupMemberStat struct {
	Code   int `json:"retcode"`
	Result struct {
		Stats []MemberStat
	} `json:"result"`
}

群成员在线信息 result结构

type ResultGroupNameListMask

type ResultGroupNameListMask struct {
	Code   int `json:"retcode"`
	Result struct {
		GroupMasks []interface{} `json:"gmasklist"` // TODO
		GroupNames []GroupName   `json:"gnamelist"`
		GroupMarks []MarkName    `json:"gmarklist"`
	} `json:"result"`
}

群列表 result结构

type ResultLogin2

type ResultLogin2 struct {
	Code   int    `json:"retcode"`
	Msg    string `json:"errmsg"`
	Result struct {
		Uin        Uin    `json:"uin"`
		VerifyCode string `json:"vfwebqq"`
		SessionId  string `json:"psessionid"`
		Status     string `json:"status"`
	} `json:"result"`
}

登录 返回值结构

type ResultOfflinePic

type ResultOfflinePic struct {
	Code     int32  `json:"retcode"`
	Result   string `json:"result"`
	Progress int32  `json:"progress"`
	Filesize int32  `json:"filesize"`
	Filename int32  `json:"filename"`
	Filepath int32  `json:"filepath"`
}

上传离线图片 result结构

type ResultOfflinePicDl

type ResultOfflinePicDl struct {
	Code   int `json:"retcode"`
	Result struct {
		Success uint32 `json:"success"`

		FilePath string `json:"file_path"`
		// contains filtered or unexported fields
	} `json:"result"`
}

发送离线图片 result结构

type ResultOnlineBuddies

type ResultOnlineBuddies struct {
	Code   int `json:"retcode"`
	Result []struct {
		Uin        Uin    `json:"uin"`
		Status     string `json:"status"`
		ClientType uint32 `json:"client_type"`
	} `json:"result"`
}

在线好友result结构

type ResultPoll

type ResultPoll struct {
	Code   int    `json:"retcode"`
	Msg    string `json:"errmsg"`
	Result []struct {
		Type  string          `json:"poll_type"`
		Value json.RawMessage `json:"value"` // see WebQQ.event.go
	} `json:"result"`
}

poll2 result结构

type ResultQQLevel

type ResultQQLevel struct {
	Code   int `json:"retcode"`
	Result struct {
		Uin        Uin    `json:"tuin"`
		Level      uint32 `json:"level"`
		Days       uint32 `json:"days"`
		Hours      uint32 `json:"hours"`
		RemainDays uint32 `json:"remainDays"`
	} `json:"result"`
}

获取等级 result结构

type ResultRecentList

type ResultRecentList struct {
	Code   int `json:"retcode"`
	Result []struct {
		Uin  Uin    `json:"uin"`
		Type uint32 `json:"type"`
	} `json:"result"`
}

当前聊天列表result结构

type ResultSelfBusinessCard

type ResultSelfBusinessCard struct {
	Code   int `json:"retcode"`
	Result struct {
	} `json:"result"`
}

自己群名片 result结构

type ResultSingleLongNick

type ResultSingleLongNick struct {
	Code   int `json:"retcode"`
	Result []struct {
		Uin      Uin    `json:"uin"`
		LongNick string `json:"lnick"`
	} `json:"result"`
}

获取签名 result结构

type ResultStrangerInfo

type ResultStrangerInfo struct {
	Code   int        `json:"retcode"`
	Result FriendInfo `json:"result"`
}

获取陌生人信息 result结构

type ResultUserFrientds

type ResultUserFrientds struct {
	Code   int `json:"retcode"`
	Result struct {
		Friends    []Friend           `json:"friends"`
		Marknames  []MarkName         `json:"marknames"`
		Categories []FrientdCategorie `json:"categories"`
		VipInfo    []VipInfo          `json:"vipinfo"`
		Info       []FrientdInfo      `json:"info"`
	} `json:"result"`
}

获取好友列表 result结构

type SysGroupMessageType

type SysGroupMessageType string

type SystemMessageType

type SystemMessageType string

type Uin

type Uin uint64 // 用户ID

func (Uin) String

func (u Uin) String() string

type VipInfo

type VipInfo struct {
	VipLevel string `json:"vip_level"`
	Uin      Uin    `json:"u"`
	IsVip    string `json:"is_vip"`
}

会员信息

type WebQQ

type WebQQ struct {
	Id Account

	Uin Uin

	// 公有
	Friends     FriendJar
	Groups      GroupJar
	CustomFaces CustomFaceJar
	OfflinePics OfflinePicJar
	// contains filtered or unexported fields
}

WebQQ对象

func NewWebQQ

func NewWebQQ(uid Account, pwd string) (this *WebQQ)

创建WebQQ

func (*WebQQ) Login

func (this *WebQQ) Login() (err error)

登录 [2013.8.27]

func (*WebQQ) SendQun

func (this *WebQQ) SendQun(to Uin, m ContentModel) (err error)

给Uin发送消息

func (*WebQQ) SendSingle

func (this *WebQQ) SendSingle(to Uin, m ContentModel) (err error)

给Uin发送消息

func (*WebQQ) Start

func (this *WebQQ) Start() <-chan Event

开始接受消息并发送到channel

func (*WebQQ) UploadCustomFace

func (this *WebQQ) UploadCustomFace(pic io.Reader) (v string, err error)

上传自定义表情

func (*WebQQ) UploadOfflinePic

func (this *WebQQ) UploadOfflinePic(peeruin Uin, pic io.Reader) (v *ResultOfflinePic, err error)

上传离线图片

type WebQQCustomPic

type WebQQCustomPic struct {
}

type WebQQGroup

type WebQQGroup struct {
}

type WebQQSingle

type WebQQSingle struct {
	Account  Account
	Uin      Uin
	LastTalk time.Time
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL